2017-11-18 5 views
1

, was ich habe, so weit ist ein normaler Transaktionsdatenrahmen mit den folgenden Spalten verbinden.Wie Multi-Level-Datenrahmen auf Werte in Single-Level-Datenrahmen

Damit habe ich eine Zusammenfassung Datenrahmen:

store_item_years = df.groupby(
['store','item','year'])['sales'].agg(
[np.sum, np.mean, np.std, np.median, np.min, np.max]).unstack(
fill_value=0) 

die letzten Ergebnisse in einem Multi-Index mit 2 Ebenen, wie folgt aus:

   sum     mean 
     year | 2015 | 2016 | 2017 | 2015 | 2016 | 2017 | ... 
store | item sum1 ... ... mean1 mean2 ... | ...  

Nun möchte Ich mag die zusammenfassende Tabelle wieder auf den Transaktions einer verschmelzen:

store | item | year | month | day | sales | + | sum+'by'+year | mean+'by'+year 
       2015        sum1    mean1 
       2016        sum2    mean2 
       2017        ...    ... 

ich mit dem folgende zu fusionieren versuchen:

df = pd.merge(df, store_item_years, 
      left_on=['store', 'item', 'year'], 
      right_on=['store', 'item', 'year'], 
      how='left') 

, die in den folgenden Fehlern führen :

KeyError: 'year' 

Irgendwelche Ideen? Ich bin gerade dabei, mich um groupby zu kümmern. Ich habe PivotTable noch nicht untersucht.

Bitte beachten Sie, dass das Problem vereinfacht ist. Die Anzahl der store_item-Kombinationen beträgt 200 + K und andere Groupbys mit mehr als 300 Spalten. Aber immer das gleiche Prinzip.

Vielen Dank im Voraus.

Antwort

1

Ich glaube, Sie müssen zuerst unstack entfernen und dann join für linke Seite kommen:

store_item_years = df.groupby(
['store','item','year'])['sales'].agg(
[np.sum, np.mean, np.std, np.median, np.min, np.max]) 

df = df.join(store_item_years, on=['store','item','year']) 
+0

Dank! Ja, ich habe es gerade auch bemerkt. Ich werde deine Antwort akzeptieren, da du mich zu mir geschlagen hast :) – user319436

0

die Schuldigen gefunden. Entfernte .unstack().

store_item_years = df.groupby(
    ['store','item','year'])['sales'].agg(
    [np.sum, np.mean, np.std, np.median, np.min, np.max]) 

Die folgende den Kontext zu halten:

store_item_years.columns = store_item_years.columns+'_by_year' 

Und fusionieren wie folgt aus:

pd.merge(df, store_item_years.reset_index(), 
     left_on=['store', 'item', 'year'], 
     right_on=['store', 'item', 'year'], 
     how='left')