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

Adding NaN changes dtype of column in Pandas dataframe

我有一个 int 数据框:

   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

不是最好但视觉上更好的是使用 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

您可以从文档中阅读 this page

出于性能原因(在这种情况下影响很大),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

通常根本不推荐这样做,但如果您不必这样做的话。