如何按多列分组以在熊猫数据框中列出

Posted

技术标签:

【中文标题】如何按多列分组以在熊猫数据框中列出【英文标题】:How to groupby multiple columns to list in pandas DataFrame 【发布时间】:2020-04-27 04:14:20 【问题描述】:

我有一个 DataFrame df:

    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

【问题讨论】:

【参考方案1】:

使用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]  

然后MultiIndex列可以展平:

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]  

【讨论】:

现在如果想要将这些列中的每一个的平均值、最小值和最大值作为单独的列?我怎样才能得到它? 在这里需要你的帮助@jezrael ***.com/questions/59699910/… @astroluv - 对不起,我忘记发表评论了,我的问题是不明白的问题:( 我的问题是我有多个列,其名称为“x_mean”、“y_mean”。如何添加另一列将使用其他列来获取新列。 “x_new = df.x_min_max_val / (df.x_max - df.x_min) * (df.x_mean - df.x_min) + df.x_min_max_val”。同样“y_new = df.y_min_max_val / (df.y_max - df.y_min) * (df.y_mean - df.y_min) + df.y_min_max_val”。我怎样才能用一个班轮做到这一点? @astroluv 一行代码的原因是什么?你需要简化代码吗?现在我离线了,只能打电话,但是for c in ['x', 'y']:df[f'c_new'] = df[f'c_min_max_val'] / ( df[f'c_max'] - df[f'c_min'] ) * (df[f'c_mean'] - df[f'c_min']) + df[f'c_min_max_val']工作怎么样?

以上是关于如何按多列分组以在熊猫数据框中列出的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫数据框中按日期和计数值分组

按多列分组时熊猫组合键

无法获取数据,使用包 yfinance 按格式分组下载到熊猫数据框中,仅适用于我的子列表中的特定代码

在熊猫数据框中对重复的列 ID 进行分组

如何使用linq按多列分组[重复]

如何按定义的时间间隔对熊猫数据框进行分组?