Фильтрация фрейма данных на основе переменного числа условий

#python #pandas

#python #pandas

Вопрос:

У меня есть фрейм данных, подобный этому, например:

 df = pd.DataFrame({'A':['a', 'a', 'b', 'c', 'a', 'b',], 'B': [1, 2, 3, 4, 5, 6,]})
  

Что мне нужно, так это отфильтровать df на основе значения в столбце ‘A’. Проблема в том, что значения для фильтрации предоставляются конечным пользователем. Например:

 cond = ['a', 'b']
  

означает, что пользователь хочет отфильтровать df и сохранить все значения ‘a’ и ‘b’ в столбце ‘A’. Итак, в этом случае мне нужно будет отфильтровать df с этим условием:

 df = df.loc[(df['A'] == 'a') | (df['A'] == 'b')]
  

Но в следующий раз значения в cond списке могут отличаться, и мне нужно это учитывать. До сих пор я пробовал for цикл. Я был почти уверен, что это не сработает … и это не сработало:

 for item in cond:
    df = df.loc[df['A'] == item]
  

Я также пытался создать генератор под df.query() и возлагал на это большие надежды, но это тоже не сработало. К сожалению, метод не принимает генераторы:

 df = df.query(f'A == {x}' for x in cond)
# or
df = df.query('A == @x' for x in cond)
  

Не совсем уверен, что еще попробовать. Кто-нибудь сталкивался с этим типом проблемы раньше?

Ответ №1:

Вы можете попробовать с

 df = df.loc[df['A'].isin(cond)]
  

Ответ №2:

Также можно попробовать в качестве альтернативы @BEN_YO

  df.query('A==@cond')