Python 在多个系列上进行聚合的更好方法

Python 在多个系列上进行聚合的更好方法,python,pandas,Python,Pandas,如果这有点简单,请原谅,但我在别处找不到任何答案 我有一个巨大的原始事务数据框架,我将其分解为用户聚合 我的df看起来像: transid, userid, catname, amount, date, origin 1, id1, cat1, 300, 01/03/2014, cc 2, id1, cat1, 200, 02/03/2014, cc 3, id1, cat2, 250, 01/03/2014, ca 4, id2, cat1, 130, 01/03/2014, cc 5, id

如果这有点简单,请原谅,但我在别处找不到任何答案

我有一个巨大的原始事务数据框架,我将其分解为用户聚合

我的df看起来像:

transid, userid, catname, amount, date, origin
1, id1, cat1, 300, 01/03/2014, cc
2, id1, cat1, 200, 02/03/2014, cc
3, id1, cat2, 250, 01/03/2014, ca
4, id2, cat1, 130, 01/03/2014, cc
5, id2, cat2, 150, 01/03/2014, cc
大约有100万条传输记录,用户数为115k

我正在创建一个包含聚合度量的宽表,其中包含日期和userid索引

date, userid, countoftrans, sumtrans
01/03/2014, id1, 3, 750, 
现在,我很高兴这样做,但发现当我开始做分类切片时,它变得非常手动

我正在创建系列,然后将它们合并回一个数据帧,但我正在做命名切片,这是a)手动的,b)很慢

编辑:结果集需要采用一行用户id的形式,并具有广泛的列集,例如

因此,虽然Groupby聚合确实在逻辑上组织了我的数据,但这正是我想要的(我只是不太了解GroupbyObjects)

我有12个父类,然后在3-5个子类之间,将不得不在所有的这样做,所以我想一个简洁的方式来做到这一点

我尝试在不同的猫名上执行for循环,然后插入该项。这并没有真正起作用,但有没有一种更具泛石器时代的方式

谢谢


Rob

如果我正确理解了您所需的输出,这应该可以实现。(不确定为什么要先按类别进行切片,但始终可以将其添加到groupby列表中

df.groupby(['date','userid'])['amount'].agg([sum,len])
编辑:

在看到您的评论和对问题的编辑后,我了解到您想要的是每个用户id一行,对于每个事务类别,有几个列具有摘要统计信息。因此user101的行将包含cat1事务数、cat1事务数、cat2事务数、cat2事务数等等,对吗

在这种情况下,您需要的是:

grouped = df.groupby(['userid','catname'])
aggregated = grouped['amount'].agg([len,sum])
result = aggregated.unstack('catname')

这将为您提供所需的数据帧,尽管它具有层次化的列索引。如果您不喜欢它,应该让您开始崩溃该索引。

人们倾向于说,而不是“泛石器时代”;-)现在这很可爱!)我说“pandonic”来反映“pythonic”。谢谢,这有助于我完美简化聚合过程的基础知识,但这会让我在使用groupby对象时遇到一些复杂的情况。我猜我在最后创建了一个稀疏矩阵。如果你编辑你的问题来解释为什么这与你想要的不同,我可以更新我的答案!我只是在与“这么容易吗?!”的概念作斗争。我认为是这样!!谢谢,我已经考虑过了,现在相信它不能解决我的问题(尽管它非常有用)更新了我原来的问题。我需要一个具有宽列集的单行df(因此我按类别进行切片)。这可能只是一个获取groupedby对象并映射到DF的例子,但它仍然感觉像是额外的“努力”。
grouped = df.groupby(['userid','catname'])
aggregated = grouped['amount'].agg([len,sum])
result = aggregated.unstack('catname')