Строка sort/max с np.nan в 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 работает при простой сортировке/максимуме, но не работает при наличии 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
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
22
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Другие вопросы по теме