【问题标题】:Pandas, numpy.where(), and numpy.nanPandas、numpy.where() 和 numpy.nan
【发布时间】:2021-08-01 06:55:02
【问题描述】:

我想使用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 值?

我应该在哪里使用 numpy.nan 以外的东西? Nonepandas.NA 似乎都可以工作并且可以被 DataFrame.isna() 检测到,但我不确定这些是否是最佳选择。

谢谢!

编辑:根据@Tim Roberts 和@DYZ,numpy.where 返回一个字符串类型的数组,因此在 numpy.NaN 上调用 str 构造函数。 C 列中的值实际上是字符串“nan”。然而,问题仍然存在:在这里最优雅的事情是什么?我应该使用None 吗?还是别的什么?

【问题讨论】:

    标签: python pandas dataframe numpy nan


    【解决方案1】:

    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)
    

    【讨论】:

      【解决方案2】:

      B 是纯数字列。 C 混合了字符串和数字,因此该列的类型为“object”,并且打印方式不同。

      【讨论】:

      • 它的 打印 不同。它不同的。
      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2018-06-15
      • 2019-07-26
      • 1970-01-01
      • 2013-06-20
      • 2015-06-14
      • 2021-09-16
      相关资源
      最近更新 更多