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

问题描述 投票:2回答:1

我有以下数据帧:

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'})

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

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

有一个更好的方法吗?

python pandas dataframe group-by pandas-groupby
1个回答
3
投票

这里有几点需要注意 -

  1. agg采取dict。在这种情况下,键是用于执行聚合的列,值是函数或函数列表。
  2. pd.TimeGrouper已被弃用(自v0.21起)。请改用pd.Grouper

这是我建议做的,假设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位。

© www.soinside.com 2019 - 2024. All rights reserved.