如何创建一个由两列组成的groupby,其中包含所有可能的组合和聚合结果



我想将一个大型数据帧分组在两列或多列上,并聚合其他列。我使用groupby,但过了一段时间才意识到groupby(label1, label2)只为标签1和标签2的现有组合创建行。示例:

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

最新更新