Подтвердить что ты не робот

Запрос для NaN и других имен в Pandas

Скажем, у меня есть dataframe df с столбцом value, содержащим некоторые значения float и некоторые NaN. Как я могу получить часть фрейма данных, где мы имеем NaN , используя синтаксис запроса?

Ниже, например, не работает:

df.query( '(value < 10) or (value == NaN)' )

Я получаю name NaN is not defined (тот же для df.query('value ==NaN'))

Вообще говоря, есть ли способ использовать имена numpy в запросе, такие как inf, NaN, pi, e и т.д.?

4b9b3361

Ответ 1

В общем, вы можете использовать @local_variable_name, поэтому что-то вроде

>>> pi = np.pi; nan = np.nan
>>> df = pd.DataFrame({"value": [3,4,9,10,11,np.nan,12]})
>>> df.query("(value < 10) and (value > @pi)")
   value
1      4
2      9

будет работать, но nan не равен самому себе, поэтому value == NaN всегда будет ложным. Один из способов взломать это - использовать этот факт и использовать value != value как проверку isnan. Мы имеем

>>> df.query("(value < 10) or (value == @nan)")
   value
0      3
1      4
2      9

но

>>> df.query("(value < 10) or (value != value)")
   value
0      3
1      4
2      9
5    NaN

Ответ 2

Вы могли бы сделать что-то вроде этого. Примечание: вам нужно будет импортировать модуль numpy (as np)

df[df['value'].apply(np.isnan)]

Ответ 3

Для строк, где value не равно нулю

df.query("value == value")

Для строк, где value равно нулю

df.query("value != value")

Ответ 4

Согласно этому ответу вы можете использовать:

df.query('value < 10 | value.isnull()', engine='python')

Я проверил, что это работает.