【问题标题】:Python Pandas: Apply custom function to just one groupby columnPython Pandas:仅将自定义函数应用于一个 groupby 列
【发布时间】:2017-11-01 10:55:39
【问题描述】:

我指的是this post,其中一个自定义 lambda 函数在分组时的聚合步骤期间应用于一个特定列。

In [67]: f = {'A':['sum','mean'], 'B':['prod'], 'D': lambda g: df.ix[g.index].E.sum()}

In [69]: df.groupby('GRP').agg(f)
Out[69]:
            A                   B         D
          sum      mean      prod  <lambda>
GRP
0    0.719580  0.359790  0.102004  1.170219
1    0.454824  0.227412  0.034060  1.182901

如果不明确指定 A 列和 B 列是否可行,我很感兴趣。我正在寻找一种方法,将 sum 或 mean 等标准方法应用于 D 列以外的所有列,并将自定义 lambda 函数 应用于 D 列仅。

类似这样的:

f = {'sum', 'D': lambda g: df.ix[g.index].E.sum()}

【问题讨论】:

    标签: python python-3.x pandas dataframe pandas-groupby


    【解决方案1】:

    如果是针对所有列,只需创建一个简单的列表理解,然后更新D,就足够了。

    # default aggregate function for all columns    
    f = {x : 'sum' for x in df.columns}
    
    # override custom function for specific column
    f['D'] = lambda g: df.loc[g.index].E.sum()
    
    # apply aggregate to groupby
    df.groupby('GRP').agg(f).reindex(columns=df.columns)
    
    
                A         B         C         D         E  GRP
    GRP                                                       
    0    0.719581  0.684144  0.707859  1.170218  1.170218    0
    1    0.454824  0.523983  0.181761  1.182902  1.182902    2
    

    【讨论】:

    • 嗯,也考虑过那个解决方案。目前我正在做两个 groupby-agg 操作并根据索引加入两个结果。但是您的解决方案在性能方面应该更好。
    • 是的,它更简单,....如果您想恢复订单,只需致电reindex。编辑了我的答案以包含它。
    猜你喜欢
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 2019-06-26
    • 2019-02-16
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2018-09-05
    相关资源
    最近更新 更多