我有以下数据框:
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语句中创建新列,但似乎并非如此。
现在我可以在普通数据库中添加这些列 - 但这些值在每天的基础上相对没有意义,而且似乎是浪费处理能力/应该能够更有效地完成的事情。
有更好的方法吗?
答案 0 :(得分:3)
这里需要注意几点 -
agg
需要dict
。在这种情况下,键是要执行聚合的列,值是函数或函数列表。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
位。