在 pandas 中使用 np.nan 排序/最大字符串
sort / max string with np.nan in pandas
pandas 当我尝试获取具有 np.nan
的字符串列的最大值时抛出错误,因为 np.nan
是 float
类型并且无法与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>
df
在 convert_dtypes
之后:
letters
0 a
1 b
2 <NA>
dtypes:
df.dtypes
letters string
dtype: object
pandas 当我尝试获取具有 np.nan
的字符串列的最大值时抛出错误,因为 np.nan
是 float
类型并且无法与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>
df
在 convert_dtypes
之后:
letters
0 a
1 b
2 <NA>
dtypes:
df.dtypes
letters string
dtype: object