NaN污染两个对象DataFrame列的max()

时间:2018-10-07 13:12:04

标签: python pandas

如果我最多使用两列浮点数,即使有些列是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。

1 个答案:

答案 0 :(得分:1)

您可以告诉熊猫服用.max()时要包括什么,但是只有floatintboolean是有效类型。没有进行字符串到数字类型的隐式转换,因此在df中,不包含"3"之类的元素,以获取最大值。唯一的数值是NaN,因此返回。

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

df = df.astype(float)

,然后提供skipna=False以包括NaN

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