是否有一种首选的方法来保持numpy数组的数据类型固定为int(或int64或其他),同时仍然有一个元素列在numpy. nan中?

特别是,我正在将一个内部数据结构转换为Pandas DataFrame。在我们的结构中,我们有整数类型的列,这些列仍然有NaN(但是列的dtype是int)。如果我们把它设为DataFrame,它似乎把所有东西都重铸为浮点数,但我们希望它是int。

想法吗?

试过的东西:

我尝试在pandas下使用from_records()函数。DataFrame,与coerce_float=False,这没有帮助。我还尝试使用NumPy掩码数组,使用NaN fill_value,这也没有工作。所有这些都会导致列数据类型变成浮点数。


当前回答

这不是所有情况下的解决方案,但我(基因组坐标)已经使用0作为NaN

a3['MapInfo'] = a3['MapInfo'].fillna(0).astype(int)

这至少允许使用适当的“本机”列类型,像减法,比较等操作可以正常工作

其他回答

这现在是可能的,因为熊猫v 0.24.0

熊猫0.24。X发行说明 引用:“Pandas已经获得了保存缺少值的整型dtypes的能力。

这不是所有情况下的解决方案,但我(基因组坐标)已经使用0作为NaN

a3['MapInfo'] = a3['MapInfo'].fillna(0).astype(int)

这至少允许使用适当的“本机”列类型,像减法,比较等操作可以正常工作

我知道OP只要求NumPy或Pandas,但我认为值得一提的是polar作为支持所要求的功能的替代方案。

在polar中,整数列中任何缺失的值都是空值,并且该列仍然是整数列。

更多信息请参见polar -用户指南>来自Pandas。

如果性能不是主要问题,则可以存储字符串。

df.col = df.col.dropna().apply(lambda x: str(int(x)) )

然后你可以和NaN任意混合。如果您确实希望使用整数,则可以根据您的应用程序使用-1、0、1234567890或其他专用值来表示NaN。

你也可以临时复制列:一个是你已经有的,用浮点;另一种是实验性的,使用int或字符串。然后在每个合理的位置插入断言,检查两者是否同步。经过足够多的测试后,你就可以放手了。

从版本0.24开始,这个功能已经被添加到pandas中。

此时,它需要使用扩展dtype 'Int64'(大写),而不是默认的dtype 'Int64'(小写)。