Pandas: логическое индексирование с синтаксисом «элемент в списке»

Скажем, у меня есть DataFrame со столбцом с именем col1. Если я хочу получить все строки, где col1 == ‘a’, я могу сделать это с помощью:

df[df.col1 == ‘a’]

Если мне нужны строки, где col1 — это «a» или «b», я могу сделать:

df[(df.col1 == ‘a’) | (df.col1 == ‘b’)]

Но мне бы очень хотелось сделать что-то (синтаксически незаконное) вроде этого:

df[df.col1 in [‘a’, ‘b’, ‘c’]]

Есть ли правильный способ панд сделать это?

Вот что я использую вместо этого:

sort_func = lambda x: x in [‘a’, ‘b’, ‘c’]
mask = df[‘col1’].apply(sort_func)
df[mask]

Но… есть ли лучший способ сделать это? Это беспокоит меня.


person J Jones    schedule 26.10.2015    source источник


Ответы (1)


Используйте isin() для фильтрации.

In [212]: df = pd.DataFrame([['a', 1], ['b', 2], ['c', 3], ['d', 4]],
                            columns=['col1', 'col2'])


In [213]: df['col1'].isin(['a', 'b', 'c'])
Out[213]:
0     True
1     True
2     True
3    False
Name: col1, dtype: bool

In [214]: df.ix[df['col1'].isin(['a', 'b', 'c']), :]
Out[214]:
  col1  col2
0    a     1
1    b     2
2    c     3
person Zero    schedule 26.10.2015