NumPy或Pandas:将数组类型保持为整数,同时具有NaN值

ely*_*ely 140 python int numpy type-conversion pandas

是否有一种首选方法可以将numpy数组的数据类型固定为int(int64或者其他),同时仍然将内部元素列为numpy.NaN

特别是,我正在将内部数据结构转换为Pandas DataFrame.在我们的结构中,我们有整数类型的列仍然有NaN(但列的dtype是int).如果我们把它变成一个DataFrame,它似乎将所有东西重铸为浮点数,但我们真的很喜欢int.

思考?

事情尝试:

我尝试使用from_records()pandas.DataFrame下的函数coerce_float=False,但这并没有帮助.我也尝试使用带有NaN fill_value的NumPy掩码数组,这也没有用.所有这些都导致列数据类型变为浮点数.

Wes*_*ney 99

NaN不能存储在整数数组中.这是目前大熊猫的一个已知限制; 我一直在等待在NumPy中使用NA值取得进展(类似于R中的NAs),但是在NumPy获得这些功能之前至少需要6个月到一年,似乎:

http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na

(已添加此功能已从大熊猫版本0.24开始添加,但请注意它需要使用扩展名dtype Int64(大写),而不是默认dtype int64(小写):https: //pandas.pydata.org /pandas-docs/version/0.24/whatsnew/v0.24.0.html#optional-integer-na-support )

  • 嗨,Wes,有什么更新吗?我们遇到的问题是,根据原始列表中是否存在NA值,连接列将转换为整数或浮点数.(稍后在尝试合并这些数据帧时创建问题) (7认同)

tec*_*ife 54

此功能已添加到pandas(从版本0.24开始):https: //pandas.pydata.org/pandas-docs/version/0.24/whatsnew/v0.24.0.html#optional-integer-na-support

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

  • 现在你必须指定一个特殊的 dtype 像 `'Int64'` 来使它工作。默认情况下启用它会更好。 (2认同)

Ped*_*eña 12

如果您尝试将浮点 (1.143) 向量转换为整数 (1),并且该向量具有 NA,则将其转换为新的“Int64”数据类型将会出现错误。为了解决这个问题,你必须对数字进行四舍五入,然后执行“.astype('Int64')”

s1 = pd.Series([1.434, 2.343, np.nan])
#without round() the next line returns an error 
s1.astype('Int64')
#cannot safely cast non-equivalent float64 to int64
##with round() it works
s1.round().astype('Int64')
0      1
1      2
2    NaN
dtype: Int64
Run Code Online (Sandbox Code Playgroud)

我的用例是,我有一个浮点系列,我想将其四舍五入为 int,但是当您执行 .round() 仍然有小数时,您需要转换为 int 以删除小数。


osa*_*osa 8

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

df.col = df.col.dropna().apply(lambda x: str(int(x)) )
Run Code Online (Sandbox Code Playgroud)

然后你可以NaN随心所欲地混合.如果您真的想要整数,根据您的应用程序,您可以使用-1,或0,或1234567890,或其他一些专用值来表示NaN.

您还可以临时复制列:一个就像您一样,有浮动; 另一个实验,有整数或字符串.然后asserts在每个合理的位置插入,检查两者是否同步.经过充分的测试,你可以放下花车.


puf*_*ish 7

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

a3['MapInfo'] = a3['MapInfo'].fillna(0).astype(int)
Run Code Online (Sandbox Code Playgroud)

这至少允许使用正确的“本机”列类型,减法、比较等操作按预期工作


jpp*_*jpp 6

熊猫 v0.24+

支持NaN整数系列的功能将在 v0.24 以上版本中可用。在 v0.24 “What's New” 部分有关于这方面的信息,在Nullable Integer Data Type下有更多细节。

Pandas v0.23 及更早版本

一般来说,最好float在可能的情况下使用系列,即使系列由于包含值而从intto向上转换。这支持基于矢量化 NumPy 的计算,否则将处理 Python 级别的循环。floatNaN

文档确实建议:“一种可能性是改用dtype=object数组。” 例如:

s = pd.Series([1, 2, 3, np.nan])

print(s.astype(object))

0      1
1      2
2      3
3    NaN
dtype: object
Run Code Online (Sandbox Code Playgroud)

出于美观的原因,例如输出到文件,这可能更可取。

Pandas v0.23 及更早版本:背景

NaN被认为是float. 当前文档(从 v0.23 开始)指定了整数系列向上转换的原因float

在 NumPy 中没有从头开始内置高性能 NA 支持的情况下,主要的损失是在整数数组中表示 NA 的能力。

这种权衡主要是出于内存和性能方面的原因,同时也是为了使结果系列继续是“数字”。

由于包含,文档还提供了向上转换的规则NaN

Typeclass   Promotion dtype for storing NAs
floating    no change
object      no change
integer     cast to float64
boolean     cast to object
Run Code Online (Sandbox Code Playgroud)