Как вы фильтруете Pandas фрейм данных по множеству столбцов? - PullRequest
3 голосов
/ 16 апреля 2020

Есть ли способ отфильтровать большой фрейм данных, сравнивая несколько столбцов с набором кортежей, где каждый элемент в кортеже соответствует разному значению столбца? Например, существует ли метод .isin(), который сравнивает несколько столбцов DataFrame с набором кортежей?

Пример:

df = pd.DataFrame({
    'a': [1, 1, 1],
    'b': [2, 2, 0],
    'c': [3, 3, 3],
    'd': ['not', 'relevant', 'column'],
})

# Filter the DataFrame by checking if the values in columns [a, b, c] match any tuple in value_set
value_set = set([(1,2,3), (1, 1, 1)])

new_df = ??  # should contain just the first two rows of df

1 Ответ

4 голосов
/ 16 апреля 2020

Вы можете использовать Series.isin, но сначала необходимо создать кортежи по первым 3 столбцам:

print (df[df[['a','b','c']].apply(tuple, axis=1).isin(value_set)])

Или преобразовать столбцы в индекс и использовать Index.isin:

print (df[df.set_index(['a','b','c']).index.isin(value_set)])

   a  b  c         d
0  1  2  3       not
1  1  2  3  relevant

Другая идея заключается в использовании внутреннего объединения DataFrame.merge помощником DataFrame с теми же именами 3 столбцов, тогда параметр on должен быть опущен, поскольку join при пересечении имен столбцов обоих df:

print (df.merge(pd.DataFrame(value_set, columns=['a','b','c'])))
   a  b  c         d
0  1  2  3       not
1  1  2  3  relevant
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...