Любой способ получить правильный вывод после передачи позиционного именованного аргумента (* args, ** kwargs) в функцию? - PullRequest
2 голосов
/ 17 февраля 2020

Я пытался отфильтровать фрейм данных на основе списка именованных аргументов, благодаря @MkWTF на этом посте . Тем не менее, я хочу использовать *args в качестве аргумента для l oop, а затем использовать функцию фильтрации, что означает, что я собираюсь получить список отфильтрованных данных на основе именованного аргумента в качестве вывода.

в моем случае мне нужно использовать cty_rpt столбец в качестве именованного аргумента (*args) для l oop через код страны, а затем использовать функцию фильтрации для получения отфильтрованного фрейма данных:

минимальные данные

вот минимальные данные, которые размещены на минимальных данных

попытка :

import pandas as pd

df=pd.read_csv('mydf.csv', encoding='utf-8')
def data_filter(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)

идея это первое подмножество df путем циклического перебора его df.cty_rpt, затем каждый подмножественный фрейм данных далее фильтруется по списку **kwargs, что составляет список отфильтрованных фреймов данных.

Я чувствую, что вышеуказанная попытка может быть реализована следующим образом :

новая попытка изменить определение моей функции

def func1(df, *args, startDate, endDate, date_col='date', inplace=False, **kwargs):
    output = []
    for arg in pd.unique(args):
        s = ''
        for i, j in kwargs.items():
            s += '{}=="{}"&'.format(i,j)
        s += '{}>"{}"&'.format(date_colname, startDate)
        s += '{}<"{}"'.format(date_colname, endDate)
        res = df.query(s, inplace=inplace)
        res = df.query(arg, inplace=False)
        output.append(res)
    return output

func1(df, df.cty_rpt,startDate='2013-12-31', endDate='2019-01-01', meat_type='Beef', temperature='Chilled',flow='E')

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

цель :

Я хочу получить список данных, в котором каждый кадр данных может быть отфильтрован по коду страны. Я явно просматривал df.cty_rpt, затем использовал dataa_filter функцию, но я чувствую, что использование *args упростит это, но я не смог получить то, что мне действительно нужно. Любая идея, чтобы сделать это? спасибо

1 Ответ

3 голосов
/ 17 февраля 2020

Надеюсь, это поможет вам. С вашей стратегией *args кажется, что вы хотите запросить уникальные значения в (потенциально) нескольких столбцах. Вы можете использовать pd.unique, чтобы получить уникальные значения из любого одного столбца, и внешние, чтобы расширить его до нескольких столбцов. Я не знаю, как вы хотите точно обрабатывать несколько столбцов, поэтому я только догадался об одном.

Вы можете построить большую часть запроса перед запуском l oop для уникальных значений cty_rpt. Составьте список и создайте строку для каждого запроса.

Я не смог заставить это работать при добавлении дат начала / окончания, поэтому я оставил это закомментированным.

import pandas as pd

def func1(df, *args, startDate, endDate, date_col='date', inplace=False, **kwargs):
    output = []
    query_terms = ['{}=="{}"'.format(*item) for item in kwargs.items()]

    # Todo: This didn't work for me, date query needs to be debugged
    # query_terms += [
    #    '{}>"{}"'.format(date_col, startDate),
    #    '{}<"{}"'.format(date_col, endDate)]

    for series in args:
        for name in pd.unique(series):
            print('querying', series.name, name)
            s = "&".join(query_terms + ['{}=="{}"'.format(series.name, name)])
            res = df.query(s, inplace=inplace) # todo: i think inplace should always be false
            output.append(res)
    return output

df = pd.read_csv("mydf.csv", encoding="utf-8")
print(df)
result = func1(df, df.cty_rpt,startDate='2013-12-31', endDate='2019-01-01', meat_type='Beef', temperature='Chilled',flow='E')

for res in result:
    print('------------------------------')
    print(res)

Вывод

    Unnamed: 0 flow cty_rpt     origin           destination      value      qty1       date animal_type meat_type temperature
0            0    E      AR  Argentina               Albania  115691.00  18.26200   1/1/2017      Bovine      Beef      Frozen
1            1    I      AR  Argentina               Albania   72425.20  19.17100   1/1/2016      Bovine      Beef      Frozen
2            2    I      US  Argentina                Angola  109523.15  50.94100   5/1/2014      Bovine      Beef      Frozen
3            3    E      US  Argentina  United Arab Emirates    1078.00   0.15300  10/1/2014      Bovine      Beef     Chilled
4            4    E      US  Argentina               Albania    3373.00   0.26200  12/1/2014      Bovine      Pork      Frozen
5            5    E      US  Argentina                Angola   36308.77   9.55494   4/1/2015      Bovine      Pork      Frozen
6            6    E      AR  Argentina                Angola   10654.65   0.87569   6/1/2017      Bovine      Pork     Chilled
7            7    E      AR  Argentina  United Arab Emirates      86.50   0.02000   7/1/2016      Bovine      Pork     Chilled
8            8    I      AR  Argentina                Angola   68797.00  12.12000   1/1/2014      Bovine      Beef     Chilled
9            9    I     AUC  Argentina                Angola   42000.00  21.00000   2/1/2017      Bovine      Beef      Frozen
10          10    I     AUC  Argentina               Albania  180078.00  26.79100  12/1/2017      Bovine      Beef      Frozen
11          11    I     AUC  Argentina                Angola  194402.47  45.29000   1/1/2015      Bovine      Pork      Frozen
12          12    I     AUC  Argentina  United Arab Emirates   97928.05   6.47850   1/1/2014      Bovine      Pork     Chilled
13          13    E      US  Argentina                Angola   61430.00  10.85000   4/1/2014      Bovine      Beef     Chilled
14          14    E      US  Argentina                Angola    4153.80   1.97800  12/1/2014      Bovine      Beef      Frozen
15          15    E      US  Argentina               Albania   55599.30  10.29300   6/1/2014      Bovine      Beef      Frozen
16          16    I      US  Argentina                Angola   11531.00   0.20100  10/1/2014      Bovine      Beef      Frozen
17          17    I      AR  Argentina  United Arab Emirates    1908.50   0.17800   4/1/2017      Bovine      Pork      Frozen
18          18    I      AR  Argentina                Angola   59476.10  10.85600   1/1/2018      Bovine      Pork      Frozen
19          19    E      CN  Argentina                Angola  452174.70  74.82600  12/1/2014      Bovine      Pork      Frozen
20          20    E      CN  Argentina               Albania  101596.00  13.57200  11/1/2014      Bovine      Pork      Frozen
21          21    E      KR  Argentina                Angola  135035.00  27.00700   5/1/2014      Bovine      Beef      Frozen
22          22    E      KR  Argentina                Angola   86506.00  46.76000  10/1/2015      Bovine      Beef      Frozen
23          23    I      KR  Argentina             Argentina  300876.85  24.53188   3/1/2014      Bovine      Beef     Chilled
24          24    E      KR  Argentina               Albania  475380.06  72.74437   9/1/2015      Bovine      Pork      Frozen
25          25    E      AR  Argentina               Albania   80396.00   8.77800   1/1/2018      Bovine      Pork      Frozen
26          26    I      AR  Argentina  United Arab Emirates     160.00   0.02000  11/1/2014      Bovine      Pork     Chilled
27          27    I      US  Argentina               Albania  212000.00  26.50000  10/1/2015      Bovine      Beef      Frozen
28          28    E      US  Argentina               Albania  164459.08  20.70592  12/1/2015      Bovine      Beef      Frozen
29          29    E     AUC  Argentina               Albania  235810.00  49.22200   3/1/2015      Bovine      Beef      Frozen
querying cty_rpt AR
querying cty_rpt US
querying cty_rpt AUC
querying cty_rpt CN
querying cty_rpt KR
------------------------------
Empty DataFrame
Columns: [Unnamed: 0, flow, cty_rpt, origin, destination, value, qty1, date, animal_type, meat_type, temperature]
Index: []
------------------------------
    Unnamed: 0 flow cty_rpt     origin           destination    value    qty1       date animal_type meat_type temperature
3            3    E      US  Argentina  United Arab Emirates   1078.0   0.153  10/1/2014      Bovine      Beef     Chilled
13          13    E      US  Argentina                Angola  61430.0  10.850   4/1/2014      Bovine      Beef     Chilled
------------------------------
Empty DataFrame
Columns: [Unnamed: 0, flow, cty_rpt, origin, destination, value, qty1, date, animal_type, meat_type, temperature]
Index: []
------------------------------
Empty DataFrame
Columns: [Unnamed: 0, flow, cty_rpt, origin, destination, value, qty1, date, animal_type, meat_type, temperature]
Index: []
------------------------------
Empty DataFrame
Columns: [Unnamed: 0, flow, cty_rpt, origin, destination, value, qty1, date, animal_type, meat_type, temperature]
Index: []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...