Фильтрация кадра данных pandas с использованием значений из dict

Мне нужно отфильтровать кадр данных с помощью dict, построенный с ключом, являющимся именем столбца, и значением, являющимся значением, которое я хочу фильтровать:

filter_v = {'A':1, 'B':0, 'C':'This is right'} # this would be the normal approach df[(df['A'] == 1) & (df['B'] ==0)& (df['C'] == 'This is right')] 

Но я хочу что-то сделать на линии

 for column, value in filter_v.items(): df[df[column] == value] 

но это будет фильтровать кадр данных несколько раз, по одному значению за раз и не применять все фильтры одновременно. Есть ли способ сделать это программно?

EDIT: пример:

 df1 = pd.DataFrame({'A':[1,0,1,1, np.nan], 'B':[1,1,1,0,1], 'C':['right','right','wrong','right', 'right'],'D':[1,2,2,3,4]}) filter_v = {'A':1, 'B':0, 'C':'right'} df1.loc[df1[filter_v.keys()].isin(filter_v.values()).all(axis=1), :] 

дает

  ABCD 0 1 1 right 1 1 0 1 right 2 3 1 0 right 3 

но ожидаемый результат

  ABCD 3 1 0 right 3 

следует выбрать только последний.

3 Solutions collect form web for “Фильтрация кадра данных pandas с использованием значений из dict”

IIUC, вы должны иметь возможность сделать что-то вроде этого:

 >>> df1.loc[(df1[list(filter_v)] == pd.Series(filter_v)).all(axis=1)] ABCD 3 1 0 right 3 

Это работает, делая серию для сравнения:

 >>> pd.Series(filter_v) A 1 B 0 C right dtype: object 

Выбор соответствующей части df1 :

 >>> df1[list(filter_v)] ACB 0 1 right 1 1 0 right 1 2 1 wrong 1 3 1 right 0 4 NaN right 1 

Поиск, где они совпадают:

 >>> df1[list(filter_v)] == pd.Series(filter_v) ABC 0 True False True 1 False False True 2 True False False 3 True True True 4 False False True 

Поиск, где они все совпадают:

 >>> (df1[list(filter_v)] == pd.Series(filter_v)).all(axis=1) 0 False 1 False 2 False 3 True 4 False dtype: bool 

И, наконец, используя это для индексации в df1:

 >>> df1.loc[(df1[list(filter_v)] == pd.Series(filter_v)).all(axis=1)] ABCD 3 1 0 right 3 

Вот как это сделать:

 df.loc[df[filter_v.keys()].isin(filter_v.values()).all(axis=1), :] 

ОБНОВИТЬ:

Когда значения будут одинаковыми по столбцам, вы можете сделать что-то вроде этого:

 # Create your filtering function: def filter_dict(df, dic): return df[df[dic.keys()].apply( lambda x: x.equals(pd.Series(dic.values(), index=x.index, name=x.name)), asix=1)] # Use it on your DataFrame: filter_dict(df1, filter_v) 

Который дает:

  ABCD 3 1 0 right 3 

Если вы часто это делаете, вы можете зайти так далеко, чтобы установить DataFrame для легкого доступа к этому фильтру:

 pd.DataFrame.filter_dict_ = filter_dict 

И затем используйте этот фильтр следующим образом:

 df1.filter_dict_(filter_v) 

Это даст тот же результат.

НО , это не правильный способ сделать это, ясно. Я бы использовал подход DSM.

Вот еще один способ:

 filterSeries = pd.Series(np.ones(df.shape[0],dtype=bool)) for column, value in filter_v.items(): filterSeries = ((df[column] == value) & filterSeries) 

Это дает:

 >>> df[filterSeries] ABCD 3 1 0 right 3 
  • Значение пытается быть установлено на копии среза из DataFrame
  • Сравнение строк блока данных pandas (строки имеют некоторые перекрывающиеся значения)
  • pandas: как выбрать первую строку в каждой группе GROUP BY?
  • Прочтите фрейм данных pandas из csv, начиная с заголовка non-fix
  • Как указать dtype при использовании pandas.read_csv для загрузки данных из файлов csv?
  • Найдите максимальное значение столбца и верните соответствующие значения строк с помощью Pandas
  • Numpy isnan () терпит неудачу в массиве поплавков (из приложения pandas dataframe)
  • Fillna в нескольких столбцах на месте в Python Pandas
  • Заполнить недостающие значения строк в кадре данных pandas
  • Как использовать encode (Python 3), чтобы исправить код не-ascii для импорта CSV в Pandas?
  • Функции GroupBy в Python Pandas, такие как SUM (col_1 * col_2), средневзвешенные значения и т. Д.
  • Python - лучший язык программирования в мире.