【问题标题】:How to group by and aggregate on multiple columns in pandas如何在 Pandas 中对多个列进行分组和聚合
【发布时间】:2019-01-10 04:46:15
【问题描述】:

我在熊猫中有以下数据框

 ID     Balance     ATM_drawings    Value
 1      100         50              345 
 1      150         33              233
 2      100         100             333 
 2      100         100             234

我想要所需格式的数据

 ID     Balance_mean    Balance_sum     ATM_Drawings_mean    ATM_drawings_sum 
 1      75              250             41.5                 83 
 2      200             100             200                  100

我正在使用以下命令在 pandas 中执行此操作

 df1= df[['Balance','ATM_drawings']].groupby('ID', as_index = False).agg(['mean', 'sum']).reset_index()

但是,它并没有给出我想要得到的东西。

【问题讨论】:

    标签: python pandas dataframe indexing pandas-groupby


    【解决方案1】:

    您可以使用字典为每个系列指定聚合函数:

    d = {'Balance': ['mean', 'sum'], 'ATM_drawings': ['mean', 'sum']}
    res = df.groupby('ID').agg(d)
    
    # flatten MultiIndex columns
    res.columns = ['_'.join(col) for col in res.columns.values]
    
    print(res)
    
        Balance_mean  Balance_sum  ATM_drawings_mean  ATM_drawings_sum
    ID                                                                
    1            125          250               41.5                83
    2            100          200              100.0               200
    

    或者你可以通过dict.fromkeys定义d

    d = dict.fromkeys(('Balance', 'ATM_drawings'), ['mean', 'sum'])
    

    【讨论】:

    • 如何将列名更改为所需的?它似乎是多索引数据框
    • 我可以用credit_card_bal.groupby('ID', as_index = False).agg({'Balance':['sum','mean'], 'ATM_drawings':['sum','mean'], }).reset_index()做到这一点
    • 完美运行,但我将ID_ 作为一列如何从ID 列中删除_
    • 根据我的工作示例,如果您不使用reset_index,您应该得到ID_。您可以将其作为最后一步:df = df.reset_index().
    【解决方案2】:

    不确定如何使用agg 实现此目的,但您可以重用“groupby”对象以避免多次执行操作,然后使用转换:

    import pandas as pd
    
    df = pd.DataFrame({
        "ID": [1, 1, 2, 2],
        "Balance": [100, 150, 100, 100],
        "ATM_drawings": [50, 33, 100, 100],
        "Value": [345, 233, 333, 234]
    })
    
    gb = df.groupby("ID")
    df["Balance_mean"] = gb["Balance"].transform("mean")
    df["Balance_sum"] = gb["Balance"].transform("sum")
    df["ATM_drawings_mean"] = gb["ATM_drawings"].transform("mean")
    df["ATM_drawings_sum"] = gb["ATM_drawings"].transform("sum")
    print df
    

    产量:

       ID  Balance  Balance_mean  Balance_sum  ATM_drawings  ATM_drawings_mean  ATM_drawings_sum  Value
    0   1      100           125          250            50               41.5                83    345
    1   1      150           125          250            33               41.5                83    233
    2   2      100           100          200           100              100.0               200    333
    3   2      100           100          200           100              100.0               200    234
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 2019-06-12
      • 1970-01-01
      相关资源
      最近更新 更多