簡體   English   中英

如何創建包含所有可能組合和聚合結果的兩列的 groupby

[英]How to create a groupby of two columns with all possible combinations and aggregated results

我想將一個大的 dataframe 分組到兩個或更多列上並聚合其他列。 我使用 groupby 但一段時間后意識到groupby(label1, label2)只為 label1 和 label2 的現有組合創建行。 例子:

lijst = [['a', 1, 3],
         ['b', 2, 6],
         ['a', 2, 7],
         ['b', 2, 2],
         ['a', 1, 8]]
data = pd.DataFrame(lijst, columns=['letter', 'cijfer', 'getal'])
data['Aantal'] = 0
label1 = 'letter'
label2 = 'cijfer'
df = data.groupby([label1, label2]).agg({'Aantal': 'count', 'getal': sum})

結果:

               Aantal  getal
letter cijfer              
a      1            2     11
       2            1      7
b      2            2      8

我想要類似的東西:

               Aantal  getal
letter cijfer              
a      1            2     11
       2            1      7
b      1          NaN    NaN
       2            2      8

我嘗試了此鏈接和其他幾個鏈接,但它們都無法處理必須聚合許多列的情況(對不起,如果我錯過了)。

我能做的唯一解決方案是從以下位置制作模板 DataFrame:

 template = pd.DataFrame(index=pd.MultiIndex.from_product([data[label1].unique(), data[label2].unique()]), columns=df.columns)

然后從 df 復制所有數據。 在我看來,這是一個非常乏味的解決方案。 有沒有更好的解決方案來獲得我想要的東西?

DataFrame.unstackDataFrame.stack一起使用:

df = df.unstack().stack(dropna=False)
print (df)
               Aantal  getal
letter cijfer               
a      1          2.0   11.0
       2          1.0    7.0
b      1          NaN    NaN
       2          2.0    8.0

或者DataFrame.reindex的另一個想法:

df = df.reindex(pd.MultiIndex.from_product(df.index.levels))
print (df)
               Aantal  getal
letter cijfer               
a      1          2.0   11.0
       2          1.0    7.0
b      1          NaN    NaN
       2          2.0    8.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM