【问题标题】:How can I apply a user defined function for each grouping in Python如何为 Python 中的每个分组应用用户定义的函数
【发布时间】:2017-12-02 16:10:36
【问题描述】:

我有一个数据框 df1 如下:

Country|Month|Revenue
-------|-----|-------
US     |Jan  |100
US     |Feb  |200
US     |Mar  |300
Canada |Jan  |200
Canada |Feb  |400
Canada |Mar  |500

我想按如下方式应用用户定义函数:

df3=df1.groupby(['Country'])['Revenue'].my_cool_func()
def my_cool_func():
    b = max(Revenue)-Min(Revenue)
    c=b/2
    return c

我对 df3 的最终输出应该是:

Country|my_cool_func_rev
-------|----------------
US     |100
Canada |150

如何使用用户定义函数来获得上述输出?

【问题讨论】:

    标签: python pandas user-defined-functions pandas-groupby


    【解决方案1】:

    您可以使用GroupBy.apply 并在函数中使用Series,因此可以使用Series.maxSeries.min

    def my_cool_func(x):
        #print (x)
        return (x.max() - x.min()) / 2
    
    df3=df1.groupby(['Country'])['Revenue'].apply(my_cool_func).reset_index()
    print (df3)
      Country  Revenue
    0  Canada    150.0
    1      US    100.0
    

    或者:

    df3=df1.groupby(['Country'])['Revenue'].apply(lambda x:(x.max() - x.min()) / 2).reset_index()
    print (df3)
      Country  Revenue
    0  Canada    150.0
    1      US    100.0
    

    编辑:使用Series.std

    def my_cool_func(x):
        b = x.std()
        c=b/2
        return c
    
    df3=df1.groupby(['Country'])['Revenue'].apply(my_cool_func).reset_index()
    print (df3)
      Country    Revenue
    0  Canada  76.376262
    1      US  50.000000
    

    【讨论】:

    • 我不想对我的用户定义函数进行任何更改,因为我可能有标准偏差,而不是 max 和 min。在这种情况下,我该如何使用您的第一个选项?
    • 如果我的回答对您有帮助,请不要忘记accept - 点击答案旁边的复选标记 () 将其从灰色切换为已填充。谢谢。跨度>
    • 嗯,所以如果使用我的解决方案还有问题吗?你能解释更多吗?还是您需要从应用 2 值而不是 1 中返回?
    【解决方案2】:

    如果您有多个要聚合的列,您可以尝试的另一件事是groupby + agg

    def my_cool_func(x):
        return (x.max() - x.min()) / 2
    

    你可以直接:

    df.groupby("Country")
      .agg({
       "column1": "sum",
       "Revenue": my_cool_func,
       "columnOther": ...
      })
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2019-02-14
      相关资源
      最近更新 更多