Фильтрация кадра данных 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 
  • Преобразование между объектами datetime и Pandas Timestamp
  • pandas конвертируют некоторые столбцы в строки
  • Добавьте ярлыки x и y в сюжет панды
  • Пользовательская сортировка с помощью Pandas
  • Python Pandas объединяет только определенные столбцы
  • Как создать гистограмму / гистограмму с полосой на дискретное значение?
  • Панды заполняют отсутствующие значения в dataframe из другого фрейма данных
  • binning dataframe в пандах в Python
  •  
    Interesting Posts for Van-Lav

    Как переписать эту функцию просмотра флэшки, чтобы следовать шаблону post / redirect / get?

    Прерывание клавиатуры IPython CTRL + C несовместимо

    Как символизировать python в Homebrew?

    Есть ли библиотека json python для преобразования json в объекты модели, похожие на google-gson?

    Ускорить код python для вычисления матричных кофакторов

    Python 2.7 – запись и чтение списка из файла

    Запрос массива во встроенном списке

    django-запрос на основе динамического свойства ()

    Python server «Разрешено только одно использование каждого адреса сокета»

    Почему параметр «name» для __setattr__ включает класс, но __getattr__ нет?

    Как организовать несколько файлов python в одном модуле, не ведя себя как пакет?

    Создать матрицу с матрицей с элементами – функцию индексов

    многоклассовая классификация в xgboost (python)

    Создание списка из N случайных чисел между диапазоном чисел

    Определение списка в Python с использованием оператора умножения

    Python - лучший язык программирования в мире.