代码之家  ›  专栏  ›  技术社区  ›  daiyue

pandas groupby获取列的聚合,并将组大小放入数据帧中[重复]

  •  1
  • daiyue  · 技术社区  · 5 年前

    给出了以下(完全过度杀戮)数据帧示例

    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)] 允许对同一列应用多个函数会更好吗?但它似乎只接受字典。

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

    0 回复  |  直到 6 年前
        1
  •  105
  •   bmu    8 年前

    您可以简单地将函数作为列表传递:

    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
    
        2
  •  5
  •   Chang She    12 年前

    是否需要这样的工作:

    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
    
        3
  •  5
  •   cs95 abhishek58g    6 年前

    实现这一点的一个明显方法是指定一个字典,将列名称映射到要聚合的函数列表:

    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
    

    这也消除了输出中的多索引。


    在更新版本的pandas中,如果使用字典为聚合输出指定列名,您将获得 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. 在熊猫的最新版本中,可以通过传递元组列表来更简单地指定这一点。如果以这种方式指定函数, 全部的 该列的函数需要指定为(名称、函数)对的元组。

    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