[英]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.unstack
與DataFrame.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.