【问题标题】:Pandas Groupby: Aggregate and ConditionalPandas Groupby:聚合和条件
【发布时间】:2018-09-29 04:27:08
【问题描述】:

我在 PD 数据框中按项目-日期对分组,并希望将一些使用 lambda 的自定义条件函数添加到更大的聚合函数中。

使用提示here,我可以执行以下操作,它可以正常工作并计算给定列中的正值和负值。

item_day_count=item_day_group['PriceDiff_pct'].agg({'Pos':lambda val: (val > 0).sum(),'Neg':lambda val: (val <= 0).sum()}).reset_index()

我还可以做一个不同的聚合,它包含预构建的聚合和返回正确统计数据的自定义百分位函数:

item_day_count_v2=item_day_group['PriceDiff_pct'].agg(['count','min',percentile(25),'mean','median',percentile(75),'max']).reset_index()

但我不知道如何将它们组合成一个更大的函数 - 当我尝试以下操作时出现错误:AttributeError: 'DataFrameGroupBy' object has no attribute 'name'

item_day_count_v3=item_day_group['PriceDiff_pct'].agg(['count',{'Pos_Return':lambda val: (val > 0).sum(),'Neg_Return':lambda val: (val <= 0).sum()},'min',percentile(25),'mean','median',percentile(75),'max']).reset_index() 

有谁知道如何组合这些功能?似乎考虑到两者分开工作,我已经很接近了。感谢您的帮助!

【问题讨论】:

    标签: python pandas aggregate pandas-groupby


    【解决方案1】:

    我不建议将 dict 中定义的 func 和这样的本地聚合器结合起来。您可以将它们作为具有函数名称和函数的元组列表传递,如下所示:

    item_day_count_v3 = item_day_group['PriceDiff_pct'].agg([
        ('Count', 'count'), 
        ('Pos_Return', lambda val: (val > 0).sum()), 
        ('Neg_Return', lambda val: (val < 0).sum()), 
        ('Mean', 'mean'), 
        ('Median', 'median'), 
        ('25%Percntile', percentile(25)), 
        ('75%Percntile', percentile(75)), 
        ('Max', 'max')
    ]).reset_index()
    

    函数名将是列名。

    【讨论】:

      【解决方案2】:

      来自 pandas docs 的 aggregate() 方法:

      接受的组合是:

      • 字符串函数名

      • 功能

      • 函数列表

      • 列名字典 -> 函数(或函数列表)

      不过,我会说它不支持所有组合。

      所以,你可以试试这个:

      首先获取字典中的所有内容,然后使用该字典进行聚合。

      # The functions to agg on every column.
      agg_dict = dict((c, ['count','min',percentile(25),'mean','median',percentile(75),'max']) for c in item_day.columns.values)
      
      # Append to the dict the column-specific functions.
      agg_dict['Pos_Return'] = lambda val: (val > 0).sum()
      agg_dict['Neg_Return'] = lambda val: (val <= 0).sum()
      
      # Agg using the dict.
      item_day_group['PriceDiff_pct'].agg(agg_dict)
      

      【讨论】:

        【解决方案3】:

        正如其他人所说,您不能在 agg() 方法中将命名函数与字典混合。

        这是实现您想要的实用方法。让我们编一些数据。

        df = pd.DataFrame({'A':['x', 'y']*3,
                           'B':[10,20,30,40,50,60]})
        
        df
        Out[38]: 
           A   B
        0  x  10
        1  y  20
        2  x  30
        3  y  40
        4  x  50
        5  y  60
        

        定义一个函数来计算大于或等于 30 的值。

        def ge30(x):
            return (x>=30).sum()
        

        现在在groupby().agg() 中使用您的自定义函数。

        df.groupby('A').agg(['sum', 'mean', ge30])
        Out[40]: 
             B          
           sum mean ge30
        A               
        x   90   30    2
        y  120   40    2
        

        【讨论】:

          猜你喜欢
          • 2019-08-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-17
          • 2020-01-28
          • 2021-11-01
          • 1970-01-01
          • 2014-11-23
          相关资源
          最近更新 更多