Pandas、numpy.where() 和 numpy.nan
Pandas, numpy.where(), and numpy.nan
我想使用 numpy.where() 向 pandas.DataFrame 添加一列。我想对条件为假的行使用 NaN 值(以指示这些值“缺失”)。
考虑:
>>> import numpy; import pandas
>>> df = pandas.DataFrame({'A':[1,2,3,4]}); print(df)
A
0 1
1 2
2 3
3 4
>>> df['B'] = numpy.nan
>>> df['C'] = numpy.where(df['A'] < 3, 'yes', numpy.nan)
>>> print(df)
A B C
0 1 NaN yes
1 2 NaN yes
2 3 NaN nan
3 4 NaN nan
>>> df.isna()
A B C
0 False True False
1 False True False
2 False True False
3 False True False
为什么B显示“NaN”而C显示“nan”?为什么 DataFrame.isna() 无法检测到 C 中的 NaN 值?
我应该在 where 里面使用 numpy.nan 以外的东西吗? None
和 pandas.NA
似乎都有效并且可以被 DataFrame.isna() 检测到,但我不确定这些是最佳选择。
谢谢!
编辑:根据@Tim Roberts 和@DYZ,numpy.where returns 一个字符串类型的数组,因此在 numpy.NaN 上调用了 str 构造函数。 C 列中的值实际上是字符串“nan”。然而,问题仍然存在:在这里最优雅的做法是什么?我应该使用 None
吗?或者别的什么?
B 是一个纯数字列。 C 混合使用字符串和数字,因此该列的类型为“object”,并且打印方式不同。
np.where
将第二个和第三个参数强制转换为相同的数据类型。由于第二个参数是一个字符串,第三个也被转换为一个字符串,通过调用函数 str()
:
str(numpy.nan)
# 'nan'
结果,C列的值都是字符串。
您可以先用 None
填充 NaN 行,然后用 fillna()
:
将它们转换为 np.nan
df['C'] = numpy.where(df['A'] < 3, 'yes', None)
df['C'].fillna(np.nan, inplace=True)
我想使用 numpy.where() 向 pandas.DataFrame 添加一列。我想对条件为假的行使用 NaN 值(以指示这些值“缺失”)。
考虑:
>>> import numpy; import pandas
>>> df = pandas.DataFrame({'A':[1,2,3,4]}); print(df)
A
0 1
1 2
2 3
3 4
>>> df['B'] = numpy.nan
>>> df['C'] = numpy.where(df['A'] < 3, 'yes', numpy.nan)
>>> print(df)
A B C
0 1 NaN yes
1 2 NaN yes
2 3 NaN nan
3 4 NaN nan
>>> df.isna()
A B C
0 False True False
1 False True False
2 False True False
3 False True False
为什么B显示“NaN”而C显示“nan”?为什么 DataFrame.isna() 无法检测到 C 中的 NaN 值?
我应该在 where 里面使用 numpy.nan 以外的东西吗? None
和 pandas.NA
似乎都有效并且可以被 DataFrame.isna() 检测到,但我不确定这些是最佳选择。
谢谢!
编辑:根据@Tim Roberts 和@DYZ,numpy.where returns 一个字符串类型的数组,因此在 numpy.NaN 上调用了 str 构造函数。 C 列中的值实际上是字符串“nan”。然而,问题仍然存在:在这里最优雅的做法是什么?我应该使用 None
吗?或者别的什么?
B 是一个纯数字列。 C 混合使用字符串和数字,因此该列的类型为“object”,并且打印方式不同。
np.where
将第二个和第三个参数强制转换为相同的数据类型。由于第二个参数是一个字符串,第三个也被转换为一个字符串,通过调用函数 str()
:
str(numpy.nan)
# 'nan'
结果,C列的值都是字符串。
您可以先用 None
填充 NaN 行,然后用 fillna()
:
np.nan
df['C'] = numpy.where(df['A'] < 3, 'yes', None)
df['C'].fillna(np.nan, inplace=True)