【问题标题】: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

【问题讨论】:

    标签: python pandas list dataframe pandas-groupby


    【解决方案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 stackoverflow.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']工作怎么样?
    猜你喜欢
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2017-07-08
    • 2022-01-12
    • 2016-06-04
    • 1970-01-01
    相关资源
    最近更新 更多