如何按多列分组以在Pandas DataFrame中列出

2022-02-26 00:00:00 python pandas dataframe list pandas-groupby

问题描述

我有一个DataFramedf

    A   B   C        date
O   4   5   5   2019-06-2
1   3   5   2   2019-06-2
2   3   2   1   2019-06-2
3   4   4   3   2019-06-3
4   5   4   6   2019-06-3
5   2   3   7   2019-06-3

现在我可以使用以下代码按一列分组:

df.groupby('date')['A'].apply(list)


         A         date
O   [4,3,3]   2019-06-2
1   [4,5,2]   2019-06-3
但是,如果希望按多列分组,该怎么办呢?我试过这样的方法,但似乎不起作用:

df.groupby('date')[['A','B','C']].apply(list)

最终的DataFrame应该如下所示:

    A               B         C        date
O   [4,3,3]   [5,5,2]   [5,2,1]   2019-06-2
1   [4,5,2]   [4,4,3]   [3,6,7]   2019-06-3

解决方案

使用GroupBy.agg而不是GroupBy.apply

df1 = df.groupby('date')[['A','B','C']].agg(list).reset_index()
print (df1)
        date          A          B          C
0  2019-06-2  [4, 3, 3]  [5, 5, 2]  [5, 2, 1]
1  2019-06-3  [4, 5, 2]  [4, 4, 3]  [3, 6, 7]

编辑:如果要进行更多聚合,请在列表中传递:

df2 = df.groupby('date')[['A','B','C']].agg(['mean','min','max', list])
print (df2)
                  A                            B                            C  
               mean min max       list      mean min max       list      mean   
date                                                                            
2019-06-2  3.333333   3   4  [4, 3, 3]  4.000000   2   5  [5, 5, 2]  2.666667   
2019-06-3  3.666667   2   5  [4, 5, 2]  3.666667   3   4  [4, 4, 3]  5.333333   

                              
          min max       list  
date                          
2019-06-2   1   5  [5, 2, 1]  
2019-06-3   3   7  [3, 6, 7]  

然后可以展平多索引列:

df2 = df.groupby('date')[['A','B','C']].agg(['mean','min','max', list])
df2.columns = df2.columns.map(lambda x: f'{x[0]}_{x[1]}')
df2 = df2.reset_index()
print (df2)
        date    A_mean  A_min  A_max     A_list    B_mean  B_min  B_max  
0  2019-06-2  3.333333      3      4  [4, 3, 3]  4.000000      2      5   
1  2019-06-3  3.666667      2      5  [4, 5, 2]  3.666667      3      4   

      B_list    C_mean  C_min  C_max     C_list  
0  [5, 5, 2]  2.666667      1      5  [5, 2, 1]  
1  [4, 4, 3]  5.333333      3      7  [3, 6, 7]  

相关文章