любой эффективный способ циклически проходить по столбцам с его списком значений для условной фильтрации в pandas? - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь условно отфильтровать фрейм данных, где я собираюсь циклически перемещаться по столбцам и списку его значений для условной фильтрации, но результирующий фрейм данных был отфильтрован неправильно. Я использовал известный метод фильтрации для pandas кадра данных на SO, например post 1 , post2 , и я хочу параметризовать эти процессы выбора данных в функции, но циклически проходить по столбцам со списком значений не работает правильно. Любая возможная идея, чтобы преодолеть эту проблему? любая мысль?

минимальный воспроизводимый пример :

вот минимальный воспроизводимый пример для gist , который я использовал в своей попытке.

моя попытка :

Я попробовал этот подход, и он работал довольно хорошо, но я хочу параметризоваться в функции.

import pandas as pd

df = pd.read_csv('minimal_df.csv', encoding='utf-8')
df= df[(df['meat_type']=='Beef') & (df['trade_type']=='E') & (df['origin']=='US') & (df['date'] >'2014-01-01') & (df['date'] <'2019-01-01')]

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

def data_filter(df, colList, vaList, startDate, endDate):
    for col in colList:
        for val in vaList:
            masker = df[df[col]==val]
            masker.reset_index(drop=True)
            masker = masker.loc[(masker['date']> startDate) & (masker['date'] < endDate)]
    return masker

columns = ['meat_type', 'temperature','origin']
values = ['Beef', 'Frozen','US']
dat_filter(df=df, colList=columns, vaList=values, startDate='2013-12-31', endDate='2019-01-01')

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

Как я могу сделать свою функцию еще более эффективной, например, вместо использования массива в качестве параметра, есть ли лучший способ передать параметр в функцию, чтобы мы могли выбрать несколько столбцов со списком значений? Какие-нибудь мысли? Спасибо

1 Ответ

2 голосов
/ 13 февраля 2020

Для этого можно использовать pd.query .

Сначала создайте строку запроса и передайте ее функции.

Пример строки запроса выглядит следующим образом :

'meat_type=="Beef"&temperature=="Frozen"&origin=="US"&startDate>"2013-12-31"&endDate<"2019-01-01"'

Для параметризации вы можете использовать его двумя способами:

  • передавать столбцы и значения в виде списка
  • создавать столбцы в качестве параметров, используя kwargs

Ниже приведены две функции:

def filter_1(df, startDate, endDate, date_colname="date", cols=None, vals=None, inplace=False):
  s = ''
  for i,j in zip(cols,vals):
      s += '{}=="{}"&'.format(i,j)

  s += '{}>"{}"&'.format(date_colname, startDate)
  s += '{}<"{}"'.format(date_colname, endDate)
  return df.query(s, inplace=inplace)

def filter_2(df, startDate, endDate, date_colname="date", inplace=False, **kwargs):
  s = ''
  for i,j in kwargs.items():
      s += '{}=="{}"&'.format(i,j)

  s += '{}>"{}"&'.format(date_colname, startDate)
  s += '{}<"{}"'.format(date_colname, endDate)
  return df.query(s, inplace=inplace)

print(filter_1(df, startDate, endDate, cols=columns, vals=values))

print(filter_2(df, startDate, endDate, meat_type='Beef', temperature='Frozen', origin='US'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...