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
работает при простой сортировке/максимуме, но не работает при наличии 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
, который вы можете получить, используя 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>
типы:
df.dtypes
letters string
dtype: object