Запрашивает фрейм данных, но применяет фильтр только к строкам, где значение столбца не равно NaN

#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']))]