添加NaN会更改Pandas数据帧中列的数据类型



我有一个内部数据帧:

0   1   2
0  0   1   2
1  3   4   5
2  6   7   8
3  9  10  11

但是,如果我将值设置为NaN,那么整个列将强制转换为浮点!显然,int列不能有NaN值。但为什么呢?

>>> df.iloc[2,1] = np.nan
>>> df
0     1   2
0  0   1.0   2
1  3   4.0   5
2  6   NaN   8
3  9  10.0  11

出于性能原因(在这种情况下会产生很大影响(,Pandas希望您的列来自同一类型,因此将尽最大努力保持这种状态。NaN是一个浮点值,所有的整数都可以无害地转换为浮点值,所以就是这样。

如果做不到,你会得到需要发生的事情来实现这一点:

>>> x = pd.DataFrame(np.arange(4).reshape(2,2))
>>> x
0  1
0  0  1
1  2  3
>>> x[1].dtype
dtype('int64')
>>> x.iloc[1, 1] = 'string'
>>> x
0       1
0  0       1
1  2  string
>>> x[1].dtype
dtype('O')

由于1不能以合理的方式(在不猜测用户想要什么的情况下(转换为字符串,因此类型被转换为对象,这是通用的,不允许任何优化。这为你提供了使你想要的工作所需的东西(一个多类型的专栏(:

>>> x[1] = x[1].astype('O') # Alternatively use a non-float NaN object
>>> x.iloc[1, 1] = np.nan  # or float('nan')
>>> x
0    1
0  0    1
1  2  NaN

如果你没有必要的话,通常根本不建议这样做。

使用pd.NA而不是np.NaN:不是最好的,但视觉效果更好

>>> df.iloc[2,1] = pd.NA
>>> df
0     1   2
0  0     1   2
1  3     4   5
2  6  <NA>   8
3  9    10  11

看起来不错,但是:

>>> df.dtypes
0     int64
1    object  # <- not float, but object
2     int64
dtype: object

您可以从文档中阅读此页。

相关内容

最新更新