首页 > 解决方案 > NaN 污染两个对象 DataFrame 列的 max()

问题描述

如果我取两列浮点数的最大值,即使有些是 NaN,结果也是相当可预测的:

>>> df = pd.DataFrame({"a": [1.0, 2.0, 3.0, 4.0],
                       "b": [3, 2, float("nan"), 9]})
>>> df
     a    b
0  1.0  3.0
1  2.0  2.0
2  3.0  NaN
3  4.0  9.0
>>> df.dtypes
a    float64
b    float64
dtype: object
>>> df[["a", "b"]].max(axis=1)
0    3.0
1    2.0
2    3.0
3    9.0
dtype: float64

虽然我不确定为什么 3.0 和 NaN 的最大值不是 NaN。

但是,如果列包含非浮点类型(此示例中为字符串),则 NaN 似乎完全污染了结果:

>>> df = pd.DataFrame({"a": ["1", "2", "3", "4"], 
                       "b": ["3", "2", float("nan"), "9"]})
>>> df
   a    b
0  1    3
1  2    2
2  3  NaN
3  4    9
>>> df.dtypes
a    object
b    object
dtype: object
>>> df[["a", "b"]].max(axis=1)
0   NaN
1   NaN
2   NaN
3   NaN
dtype: float64

我预计 max() 调用的输出将是 3、2、NaN、9。

标签: pythonpandas

解决方案


您可以告诉 pandas 在 take 中包含什么.max(),但只有floatintboolean是有效类型。没有将字符串隐式转换为数字类型,因此在取最大值时不包括df类似的元素。"3"唯一的数值NaN是这样返回的。

要获得预期的结果,您首先需要将字符串转换为数字类型,例如,

df = df.astype(float)

然后提供skipna=False包括NaN

df.max(axis=1, skipna=False)

推荐阅读