在Python中对两个数据帧进行分组和合并

时间:2018-03-07 16:32:05

标签: python pandas pandas-groupby

我现在已经在这个问题上敲了一段时间,并且无法理解它......

我有两个Pandas Dataframe df1df2,其中包含我想要整齐地汇总成一个的信息。

到目前为止,我使用了一个聚合函数来总结每个函数,如下所示:

aggregation = {'A' : {'a' : 'mean'}, 'B' : {'b' : 'mean'}, 'C' : {'c' : 'sum'}}

>> df1.groupby(by=['LEVEL_1']).agg(aggregation)

            A      B      C
            a      b      c
LEVEL_1     
lvl_a       1.0    2.0    3.0
lvl_b       4.0    5.0    6.0
lvl_c       7.0    8.0    9.0

与我的其他DataFrame相同

>> df2.groupby(by=['LEVEL_1']).agg(aggregation)

            A      B      C
            a      b      c
LEVEL_1     
lvl_a       10.0   11.0   12.0
lvl_b       13.0   14.0   15.0
lvl_c       16.0   17.0   18.0

现在,我想将这两个组合成一个整体的DataFrame,其中我的列被分组为两个"信息Universe",另外一行totals,这就是平均值每列的所有行,如下所示:

            a             b            c
            df1    df2    df1   df2    df1   df2
LEVEL_1     
lvl_a       1.0    10.0   2.0   11.0   3.0    12.0
lvl_b       4.0    13.0   5.0   14.0   6.0    15.0
lvl_c       7.0    16.0   8.0   17.0   9.0    18.0
totals      4.0    13.0   5.0   14.0   6.0    15.0
很可能,有一种超级方式可以做到这一点,但我还没想出来......

先谢谢你们。

1 个答案:

答案 0 :(得分:1)

我认为您需要concat + droplevel + swaplevel

s=pd.concat([df1,df2],axis=1,keys=['df1','df2'])
s.columns=s.columns.droplevel(1)

s=s.swaplevel(0,1,axis=1).sort_index(axis=1)
s
Out[473]: 
         a         b         c     
       df1  df2  df1  df2  df1  df2
lvl_a  1.0  1.0  2.0  2.0  3.0  3.0
lvl_b  4.0  4.0  5.0  5.0  6.0  6.0
lvl_c  7.0  7.0  8.0  8.0  9.0  9.0

更新

pd.concat([s,s.sum().to_frame('total').T])
Out[479]: 
          a           b           c      
        df1   df2   df1   df2   df1   df2
lvl_a   1.0   1.0   2.0   2.0   3.0   3.0
lvl_b   4.0   4.0   5.0   5.0   6.0   6.0
lvl_c   7.0   7.0   8.0   8.0   9.0   9.0
total  12.0  12.0  15.0  15.0  18.0  18.0