Используйте список значений для выбора строк из фрейма данных Pandas

948

Скажем, у меня есть следующий фрейм данных Pandas:

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

     A   B
0    5   1
1    6   2
2    3   3
3    4   5

Я могу подмножество на основе определенного значения:

x = df[df['A'] == 3]
x

     A   B
2    3   3

Но как я могу подмножество на основе списка значений? - что-то вроде этого:

list_of_values = [3,6]

y = df[df['A'] in list_of_values]

Получить:

     A    B
1    6    2
2    3    3
0
1641

Вы можете использовать isinметод:

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

In [2]: df
Out[2]:
   A  B
0  5  1
1  6  2
2  3  3
3  4  5

In [3]: df[df['A'].isin([3, 6])]
Out[3]:
   A  B
1  6  2
2  3  3

И чтобы получить обратное применение ~:

In [4]: df[~df['A'].isin([3, 6])]
Out[4]:
   A  B
0  5  1
3  4  5
10
  • 25
    Как бы вы вернули эти значения в порядке списка? Например, list_of_valuesимеет значения 3, затем 6, но кадр возвращается с 6, затем 3. Я говорю не о простой сортировке, а о том, как конкретно мы можем вернуть в порядке значений в списке. Jason Strimpel 14 авг.
  • 1
    Это был пример логической индексации, которая сохраняет порядок вне индекса, см. Pandas.pydata.org/pandas-docs/stable/… для более подробной информации. Нужен сорт после выделения. Wouter Overmeire 18 авг.
  • 1
    Это помогло мне stackoverflow.com/a/29108799/5629831Philippe Remy 25 мая '16 в 3:39
  • 8
    Вы также можете добиться аналогичных результатов, используя 'query' и @ <your list of values>: например: df = pd.DataFrame ({'A': [1, 2, 3], 'B': ['a', 'b', 'f']}) df = pd.DataFrame ({'A': [5,6,3,4], 'B': [1,2,3, 5]}) list_of_values ​​= [3 , 6] result = df.query ("A в @list_of_values") результат AB 1 6 2 2 3 3akuriako 28 сен.
  • 2
    @JasonStrimpel Я ответил на ваш вопрос здесь: stackoverflow.com/questions/51944021/…syltruong 21 авг.
13

Вы можете использовать метод query :

df.query('A in [6, 3]')

или

lst = [6, 3]
df.query('A in @lst')
1
  • вау, этот @ бизнес очень полезенMatt 27 мая в 18:54
1

Другой метод;

df.loc[df.apply(lambda x: x.A in [3,6], axis=1)]

В отличие от метода isin , это особенно полезно при определении того, содержит ли список функцию столбца A. Например, f(A) = 2*A - 5как функция;

df.loc[df.apply(lambda x: 2*x.A-5 in [3,6], axis=1)]

Следует отметить, что этот подход медленнее, чем isinметод.