在 pandas 中使用 np.nan 排序/最大字符串

sort / max string with np.nan in pandas

pandas 当我尝试获取具有 np.nan 的字符串列的最大值时抛出错误,因为 np.nanfloat 类型并且无法与str.

任何建议如何处理这个?

df = pd.DataFrame({'letters':['a', 'b', np.nan]})
df

# letters
# 0 a
# 1 b
# 2 NaN

for e in df['letters']:
    print(e, type(e))
    
# a <class 'str'>
# b <class 'str'>
# nan <class 'float'>
    
df['letters'].max()

给出错误:

TypeError: '>=' not supported between instances of 'str' and 'float'

----更新-----

dropna 适用于简单的 sort/max,但在 groupby 时不起作用,因为它会删除组。例如

df = pd.DataFrame({'letters':['a', 'b', np.nan, np.nan]
                  ,'grp': [1,1,1,2]})
df
#   letters grp
# 0 a   1
# 1 b   1
# 2 NaN 1
# 3 NaN 2
        
df.groupby('grp')['letters'].max()
# dropna will delete grp == 2

也许你可以先放下它们:

out = df['letters'].dropna().max()

如果您需要找到多个列的最大值,那么您可以 stack 它们;然后使用 groupby + max:

out = df.stack().groupby(level=1).max()

输出:

'b'

这是一个问题,因为您使用默认值 float NaN。

这适用于新的 pd.NA type, which you can obtain using convert_dtypes 类型 string 而不是 object:

df = df.convert_dtypes()
df['letters'].max()
# 'b'

df['letters'].max(skipna=False)
# <NA>

dfconvert_dtypes 之后:

  letters
0       a
1       b
2    <NA>

dtypes:

df.dtypes

letters    string
dtype: object