请原谅我,如果这有点简单,但我在其他地方找不到任何答案
我有一个庞大的原始事务数据DataFrame,我正在分解以便用户进行聚合。
我的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万个transk记录,115k用户
我正在创建一个包含日期和用户ID索引的聚合度量的宽表。
date, userid, countoftrans, sumtrans
01/03/2014, id1, 3, 750,
现在,我很高兴这样做,但是当我开始进行类别切片时,它会变得非常手动。
我正在创建系列,然后将它们合并回数据框但我正在做命名切片,这是a)手动和b)很慢
#take a slice from the df
cat1 = df[df.catname == "cat1"]
#group the slice by user
cat1out = cft.groupby(cft.userid)
#then do calc on series
cat1count = cat1.transid.count()
编辑:结果集必须采用1行用户ID的形式,并带有一组广泛的列,例如
因此,虽然Groupby聚合确实在逻辑上组织我的数据我的方式(我只是不太喜欢GroupbyObjects)
我有12个父类别,然后介于3-5个子类别之间,并且必须在所有类别中执行此操作,因此需要一种简洁的方法来执行此操作。
我试图对不同的猫名称进行for循环,然后插入该项目。这没有真正起作用,但是有更多的pandithic(?)方式
由于
罗布
答案 0 :(得分:1)
如果我正确理解了你想要的输出,这应该可以解决问题。 (不确定为什么要先按类别切片,但始终可以将其添加到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')
这将为您提供所需的数据帧,尽管具有分层列索引。如果您不喜欢它,this answer应该让您在折叠该索引的路上。