Groupby并在pandas中执行多个函数的聚合

时间:2017-12-31 18:28:51

标签: python pandas dataframe group-by pandas-groupby

我有以下数据框:

date          in   out  balance

01/01/2017    50    70    100
02/01/2017    100   10    190
...           ...   ...   ...

我正在使用以下代码创建摘要文件(按月分组):

df2 = df.groupby(pd.TimeGrouper(freq='M'))
df2 = df.agg({'total_in': 'sum', 'total_out': 'sum', 'balance': 'last'})

但是,我还想创建'最大'和'最大'列。

我尝试了以下

df2 = df2.agg({'total_in': 'sum', 'total_out': 'sum', 'largest in': 'max', 'largest out': 'max', 'balance': 'last'})

但是,这会为新列引发Key Error。 我曾希望我可以在Agg语句中创建新列,但似乎并非如此。

现在我可以在普通数据库中添加这些列 - 但这些值在每天的基础上相对没有意义,而且似乎是浪费处理能力/应该能够更有效地完成的事情。

有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

这里需要注意几点 -

  1. agg需要dict。在这种情况下,键是要执行聚合的列,值是函数或函数列表。
  2. pd.TimeGrouper已弃用(自v0.21起)。请改用pd.Grouper
  3. 这是我建议做的,假设date不是索引的一部分 -

    f = {
            'in'      :  [('total_in', sum), ('largest_in', max)], 
            'out'     :  [('total_out', sum), ('largest_out', max)], 
            'balance' :  'last'
    }
    df = df.groupby(pd.Grouper(key='date', freq='1M')).agg(f)
    

    每个元组由两个元素组成 - 第一个元素(例如,total_in)是结果列的名称,而第二个元素(例如,sum)是要应用于键。输出将是一个MultiIndex列的数据框。

    请注意,如果key='date'已经是索引的一部分,您可以删除date位。