фильтр pandas, где некоторые столбцы содержат любое из слов в списке - PullRequest
2 голосов
/ 11 апреля 2020

Я бы хотел отфильтровать Dataframe. Результирующий информационный фрейм должен содержать все строки, где в любом из ряда столбцов есть любое из слов списка.

Я начал использовать для циклов, но должен быть лучший способ pythonic / pandoni c .

Пример:

# importing pandas 
import pandas as pd 

# Creating the dataframe with dict of lists 
df = pd.DataFrame({'Name': ['Geeks', 'Peter', 'James', 'Jack', 'Lisa'], 
                   'Team': ['Boston', 'Boston', 'Boston', 'Chele', 'Barse'], 
                   'Position': ['PG', 'PG', 'UG', 'PG', 'UG'], 
                   'Number': [3, 4, 7, 11, 5], 
                   'Age': [33, 25, 34, 35, 28], 
                   'Height': ['6-2', '6-4', '5-9', '6-1', '5-8'], 
                   'Weight': [89, 79, 113, 78, 84], 
                   'College': ['MIT', 'MIT', 'MIT', 'Stanford', 'Stanford'], 
                   'Salary': [99999, 99994, 89999, 78889, 87779]}, 
                   index =['ind1', 'ind2', 'ind3', 'ind4', 'ind5']) 


df1 = df[df['Team'].str.contains("Boston") | df['College'].str.contains('MIT')] 
print(df1) 

Итак, понятно, как индивидуально фильтровать столбцы, содержащие определенное слово

, далее также понятно, как фильтровать строки по столбцу. содержащий любую из строк списка:

df[df.Name.str.contains('|'.join(search_values ))]

Где search_values ​​содержит список слов или строк.

search_values = ['boston','mike','whatever']

Я ищу короткий путь к коду

#pseudocode
give me a subframe of df where any of the columns 'Name','Position','Team' contains any of the words in search_values

Я знаю, что могу сделать

df[df['Name'].str.contains('|'.join(search_values )) | df['Position'].str.contains('|'.join(search_values )) | df['Team'].contains('|'.join(search_values )) ]

, но если бы у меня было 20 столбцов, это было бы беспорядком из строки кода

любое предложение?

Бонус РЕДАКТИРОВАТЬ: При просмотре списка столбцов, таких как «Имя», «Позиция», «Команда», как включить индекс? прохождение ['index', 'Name', 'Position', 'Team'] не работает.

спасибо.

Я посмотрел на это: https://www.geeksforgeeks.org/get-all-rows-in-a-pandas-dataframe-containing-given-substring/

https://kanoki.org/2019/03/27/pandas-select-rows-by-condition-and-string-operations/

Отфильтровать строки на основе списка строк в Pandas

Ответы [ 3 ]

3 голосов
/ 11 апреля 2020

Вы также можете stack с any на level=0:

cols_list = ['Name','Team'] #add column names
df[df[cols_list].stack().str.contains('|'.join(search_values),case=False,na=False)
   .any(level=0)]

        Name    Team Position  Number  Age Height  Weight College  Salary
ind1  Geeks  Boston       PG       3   33    6-2      89     MIT   99999
ind2  Peter  Boston       PG       4   25    6-4      79     MIT   99994
ind3  James  Boston       UG       7   34    5-9     113     MIT   89999
3 голосов
/ 11 апреля 2020

До apply с any

df[[c1,c2..]].apply(lambda x : x.str.contains('|'.join(search_values )),axis=1).any(axis=1)
1 голос
/ 11 апреля 2020

Вы можете просто apply в этом случае:

cols_to_filter = ['Name', 'Position', 'Team']
search_values = ['word1', 'word2']

patt = '|'.join(search_values)

mask = df[cols_to_filter].apply(lambda x: x.str.contains(patt)).any(1)

df[mask]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...