使用pandas GroupBy.agg()对同一列进行多次聚合

时间:2012-09-25 19:05:27

标签: python pandas dataframe aggregate pandas-groupby

给出以下(完全矫枉过正的)数据框示例

import pandas as pd
import datetime as dt
df = pd.DataFrame({
         "date"    :  [dt.date(2012, x, 1) for x in range(1, 11)], 
         "returns" :  0.05 * np.random.randn(10), 
         "dummy"   :  np.repeat(1, 10)
})

是否存在将两个不同聚合函数应用于同一列的现有内置方法,而无需多次调用agg

语法上错误但直观正确的方法是:

# Assume `function1` and `function2` are defined for aggregating.
df.groupby("dummy").agg({"returns":function1, "returns":function2})

显然,Python不允许重复键。有没有其他方式表达agg的输入?也许元组列表[(column, function)]可以更好地工作,以允许将多个函数应用于同一列?但似乎它只接受字典。

除了定义一个仅应用其中的两个函数的辅助函数之外,还有解决方法吗? (无论如何,它如何与聚合一起工作?)

3 个答案:

答案 0 :(得分:102)

您只需将这些功能作为列表传递:

In [20]: df.groupby("dummy").agg({"returns": [np.mean, np.sum]})
Out[20]: 
        returns          
            sum      mean

dummy                    
1      0.285833  0.028583

或作为字典:

In [21]: df.groupby('dummy').agg({'returns':
                                  {'Mean': np.mean, 'Sum': np.sum}})
Out[21]: 
        returns          
            Sum      Mean
dummy                    
1      0.285833  0.028583

答案 1 :(得分:5)

这样的事情会起作用吗?

In [7]: df.groupby('dummy').returns.agg({'func1' : lambda x: x.sum(), 'func2' : lambda x: x.prod()})
Out[7]: 
              func2     func1
dummy                        
1     -4.263768e-16 -0.188565

答案 2 :(得分:4)

一种明显的方法是指定一个字典,将列名映射到要与之聚合的函数列表:

df.groupby("dummy").agg({'returns': [function1, function2]})

df.groupby("dummy").agg({'returns': ['sum', 'mean']})

        returns          
            sum      mean
dummy                    
1      0.328953  0.032895

但是,如果您的函数仅在列上运行,则语法要简单一些-如果在系列上进行聚合,则不需要字典:

df.groupby("dummy")['returns'].agg([function1, function2])

df.groupby('dummy')['returns'].agg(['sum', 'mean'])

            sum      mean
dummy                    
1      0.328953  0.032895

这也消除了输出中的MultiIndex。


在较新的熊猫版本中,如果使用字典为聚合输出指定列名,则会得到FutureWarning

df.groupby('dummy').agg({'returns': {'Mean': 'mean', 'Sum': 'sum'}})
# FutureWarning: using a dict with renaming is deprecated and will be removed 
# in a future version

Using a dictionary for renaming columns is deprecated in v0.20.在较新的熊猫版本中,可以通过传递元组列表来更简单地指定它。如果以这种方式指定函数,则该列的 all 函数需要指定为(名称,函数)对的元组。

df.groupby("dummy").agg({'returns': [('op1', 'sum'), ('op2', 'mean')]})

        returns          
            op1       op2
dummy                    
1      0.328953  0.032895

或者,

df.groupby("dummy")['returns'].agg([('op1', 'sum'), ('op2', 'mean')])

            op1       op2
dummy                    
1      0.328953  0.032895