Запрос для 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
и т.д.?
Ответы
Ответ 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')
Я проверил, что это работает.