【问题标题】:python pandas group by and aggregate columnspython pandas分组和聚合列
【发布时间】:2018-10-05 10:18:41
【问题描述】:

我使用的是熊猫版本 0.23.0。我想通过函数使用数据框组来使用 lambda 函数生成新的聚合列..

我的数据框看起来像

ID Flag Amount User
 1  1    100    123345
 1  1    55     123346
 2  0    20     123346
 2  0    30     123347
 3  0    50     123348

我想生成一个看起来像这样的表格

ID Flag0_Count Flag1_Count  Flag0_Amount_SUM    Flag1_Amount_SUM  Flag0_User_Count Flag1_User_Count
 1  2           2           0                   155                0                2
 2  2           0           50                  0                  2                0
 3  1           0           50                  0                  1                0

这里:

  1. Flag0_Count 是 Fl​​ag = 0 的计数
  2. Flag1_Count 是 Fl​​ag = 1 的计数
  3. Flag0_Amount_SUM 是 Fl​​ag = 0 时金额的 SUNM
  4. Flag1_Amount_SUM 是 Fl​​ag = 1 时金额的 SUNM
  5. Flag0_User_Count 是 Fl​​ag = 0 时不同用户的计数
  6. Flag1_User_Count 是 Fl​​ag = 1 时不同用户的计数

我尝试过类似的东西

df.groupby(["ID"])["Flag"].apply(lambda x: sum(x==0)).reset_index()

但它会创建一个新的新数据框。这意味着我必须对所有列进行此操作,并将它们合并到一个新的数据框中。 有没有更简单的方法来做到这一点?

【问题讨论】:

    标签: python pandas group-by pandas-groupby


    【解决方案1】:

    DataFrameGroupBy.agg 按字典按列名称与聚合函数一起使用,然后按unstack 重塑,将MultiIndex 列扁平化,rename 列和最后一个reset_index

    df = (df.groupby(["ID", "Flag"])
          .agg({'Flag':'size', 'Amount':'sum', 'User':'nunique'})
          .unstack(fill_value=0))
    
    #python 3.6+
    df.columns = [f'{i}{j}' for i, j in df.columns]
    #python bellow
    #df.columns = [f'{}{}'.format(i, j) for i, j in df.columns]
    d = {'Flag0':'Flag0_Count',
         'Flag1':'Flag1_Count',
         'Amount0':'Flag0_Amount_SUM',
         'Amount1':'Flag1_Amount_SUM',
         'User0':'Flag0_User_Count',
         'User1':'Flag1_User_Count',
         }
    df = df.rename(columns=d).reset_index()
    print (df)
    
       ID  Flag0_Count  Flag1_Count  Flag0_Amount_SUM  Flag1_Amount_SUM  \
    0   1            0            2                 0               155   
    1   2            2            0                50                 0   
    2   3            1            0                50                 0   
    
       Flag0_User_Count  Flag1_User_Count  
    0                 0                 2  
    1                 2                 0  
    2                 1                 0  
    

    【讨论】: