#python #pandas #filter #nan
#питон #панды #Фильтр #nan
Вопрос:
У меня есть dataframe df:
num1 | count | count_min | count_max
a | 10 | 5 | 10
b | 15 | 6 | 11
c | 3 | NaN | NaN
Я хочу отфильтровать каждый счетчик, который не находится между count_min и count_max.
Но если count_min/ count_max равно NaN, строка должна быть сохранена.
Конечный результат должен быть:
num1 | count | count_min | count_max
a | 10 | 5 | 10
c | 3 | NaN | NaN
Поэтому мне нужно что-то вроде if /else в моем запросе, чтобы проверить, равен ли count_min / count_max NaN, прежде чем я применю фильтр.
Как я могу добиться этого с помощью синтаксиса запроса, например:
df = df.query("count >= count_min and count <= count_max")
?
Ответ №1:
Используйте Series.between
и Series.isna
:
In [4487]: df = df[df['count'].between(df.count_min, df.count_max) | (df.count_max.isna() | df.count_min.isna())]
In [4487]: df
Out[4487]:
num1 count count_min count_max
0 a 10 5.0 10.0
2 c 3 NaN NaN
Ответ №2:
Вы можете использовать np.where()
для этого случая и использовать его в качестве фильтра:
df[np.where((df['count'].between(df['count_min'].values,df['count_max'].values)) | (df['count_min'].isna()) | (df['count_max'].isna()),True,False)]
Ответ №3:
Что-то вроде этого…
df = df[(df['count_min'].isna()) | (df['count_min'].isna()) | ((df['count'] >= df['count_min'] amp; (df['count'] <= df['count_max']))]