添加 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
通常根本不推荐这样做,但如果您不必这样做的话。
我有一个 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
通常根本不推荐这样做,但如果您不必这样做的话。