J'essayais de filtrer le cadre de données en fonction de la liste des arguments nommés, grâce à @MkWTF sur ce message. Cependant, je souhaite utiliser *args comme argument pour parcourir, puis utiliser la fonction de filtrage, ce qui signifie que je vais avoir une liste de trames de données filtrées basée sur un argument nommé en tant que sortie.

Dans mon cas, je dois utiliser la colonne cty_rpt comme argument nommé (*args) pour parcourir le code du pays, puis utiliser la fonction de filtrage pour obtenir une trame de données filtrée :

données minimales

Voici les données minimales publiées sur données minimales essentielles

tentative :

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)

L'idée est d'abord un sous-ensemble df en parcourant son df.cty_rpt puis chaque sous-ensemble de données filtré par la liste de **kwargs, ce qui constituerait une liste de données filtrées.

J'ai l'impression que la tentative ci-dessus pourrait être réalisée comme suit :

nouvelle tentative de modification de la définition de ma fonction

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')

Mais j'ai une liste vide, je ne comprends pas ce qui se passe ici. Une idée? où est le bug de ma tentative ? une solution rapide à ce sujet ?

objectif :

Je souhaite obtenir une liste de cadres de données où chaque cadre de données peut être filtré par code de pays. Je parcourais explicitement df.cty_rpt puis j'utilisais la fonction dataa_filter, mais j'ai l'impression que l'utilisation de *args simplifierait cela, mais je ne pouvais pas obtenir ce dont j'avais réellement besoin. Une idée pour faire ça ? Merci

2
Hamilton 17 févr. 2020 à 07:13

1 réponse

Meilleure réponse

J'espère que cela vous amènera à mi-chemin. Avec votre stratégie *args, il semble que vous souhaitiez interroger des valeurs uniques dans (potentiellement) plusieurs colonnes. Vous pouvez utiliser pd.unique pour obtenir des valeurs uniques de n'importe quelle colonne et un externe pour l'étendre à plusieurs colonnes. Je ne sais pas comment vous voulez gérer exactement plusieurs colonnes, alors j'ai juste deviné dans un sens.

Vous pouvez générer la majeure partie de la requête avant de démarrer la boucle pour les valeurs cty_rpt uniques. Faites-le une liste et construisez la chaîne par requête.

Je n'arrivais pas à faire fonctionner cela lors de l'ajout des dates de début/fin, alors je l'ai laissé en commentaire.

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)

Production

    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: []
3
tdelaney 17 févr. 2020 à 05:53