我想将一个大型数据帧分组在两列或多列上,并聚合其他列。我使用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.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