我有这样的数据框。
df1=pd.DataFrame({"A":np.random.randint(1,10,4),"B":np.random.randint(1,10,4),"C":list('abba')})
df1.index.name="first"
df2=pd.DataFrame({"A":np.random.randint(1,10,5),"B":np.random.randint(1,10,5),"C":list('aaabb')})
df2.index.name="second"
df=pd.concat([df1,df2], keys=['first', 'second'])
df
A B C
first 0 6 5 a
1 2 2 b
2 1 6 b
3 6 9 a
second 0 6 6 a
1 9 9 a
2 8 4 a
3 7 2 b
4 9 8 b
我想像这样分组和总结结果。 (键=列“C”)
first second
A B A B
a 15 14 23 19
b 3 8 16 10
我怎样才能得到这个结果?
答案 0 :(得分:2)
您可以将groupby
与一系列看似数组的内容一起使用。您希望使用索引的第一级和列'C'
。
df.groupby([df.index.get_level_values(0), df.C]).sum() \
.unstack().stack(0).T.rename_axis(None)
答案 1 :(得分:0)
这样做的一种方法是:
In [126]: df1=pd.DataFrame({"A":np.random.randint(1,10,4),"B":np.random.randint(1,10,4),"C":list('abba')})
In [127]: df2=pd.DataFrame({"A":np.random.randint(1,10,5),"B":np.random.randint(1,10,5),"C":list('aaabb')})
In [128]: df1
Out[128]:
A B C
0 7 9 a
1 1 3 b
2 7 7 b
3 1 2 a
In [129]: df2
Out[129]:
A B C
0 3 1 a
1 3 1 a
2 7 3 a
3 9 7 b
4 9 1 b
In [130]: df = pd.concat({"first": df1.groupby('C').sum(), "second": df2.groupby('C').sum()}, axis = 1)
In [131]: del df.index.name
In [132]: df
Out[132]:
first second
A B A B
a 8 11 13 5
b 8 10 18 8