我有一个pandas DataFrame,它根据用户会话期间的“点击次数”详细说明了在线活动。有多达50,000个唯一身份用户,数据框有大约150万个样本。显然,大多数用户都有多条记录。
这四列是唯一的用户ID,用户开始服务的日期“注册”,用户使用服务的日期“会话”,总点击次数。
数据框的组织如下:
User_ID Registration Session clicks
2349876 2012-02-22 2014-04-24 2
1987293 2011-02-01 2013-05-03 1
2234214 2012-07-22 2014-01-22 7
9874452 2010-12-22 2014-08-22 2
...
(上面还有一个索引从0开始,但可以将User_ID
设置为索引。)
我想汇总自注册日期以来用户的总点击次数。数据帧(或pandas Series对象)将列出User_ID和“Total_Number_Clicks”。
User_ID Total_Clicks
2349876 722
1987293 341
2234214 220
9874452 1405
...
如何在熊猫中做到这一点?这是由.agg()
完成的吗?每个User_ID
需要单独求和。
由于有150万条记录,这是否有规模?
答案 0 :(得分:7)
IIUC您可以使用groupby
,sum
和reset_index
:
print df
User_ID Registration Session clicks
0 2349876 2012-02-22 2014-04-24 2
1 1987293 2011-02-01 2013-05-03 1
2 2234214 2012-07-22 2014-01-22 7
3 9874452 2010-12-22 2014-08-22 2
print df.groupby('User_ID')['clicks'].sum().reset_index()
User_ID clicks
0 1987293 1
1 2234214 7
2 2349876 2
3 9874452 2
如果第一栏User_ID
为index
:
print df
Registration Session clicks
User_ID
2349876 2012-02-22 2014-04-24 2
1987293 2011-02-01 2013-05-03 1
2234214 2012-07-22 2014-01-22 7
9874452 2010-12-22 2014-08-22 2
print df.groupby(level=0)['clicks'].sum().reset_index()
User_ID clicks
0 1987293 1
1 2234214 7
2 2349876 2
3 9874452 2
或者:
print df.groupby(df.index)['clicks'].sum().reset_index()
User_ID clicks
0 1987293 1
1 2234214 7
2 2349876 2
3 9874452 2
编辑:
如Alexander所示,您需要在groupby
之前过滤数据,如果Session
日期少于Registration
每个User_ID
的日期:
print df
User_ID Registration Session clicks
0 2349876 2012-02-22 2014-04-24 2
1 1987293 2011-02-01 2013-05-03 1
2 2234214 2012-07-22 2014-01-22 7
3 9874452 2010-12-22 2014-08-22 2
print df[df.Session >= df.Registration].groupby('User_ID')['clicks'].sum().reset_index()
User_ID clicks
0 1987293 1
1 2234214 7
2 2349876 2
3 9874452 2
为了更好的样本,我更改了3.行数据:
print df
Registration Session clicks
User_ID
2349876 2012-02-22 2014-04-24 2
1987293 2011-02-01 2013-05-03 1
2234214 2012-07-22 2012-01-22 7
9874452 2010-12-22 2014-08-22 2
print df.Session >= df.Registration
User_ID
2349876 True
1987293 True
2234214 False
9874452 True
dtype: bool
print df[df.Session >= df.Registration]
Registration Session clicks
User_ID
2349876 2012-02-22 2014-04-24 2
1987293 2011-02-01 2013-05-03 1
9874452 2010-12-22 2014-08-22 2
df1 = df[df.Session >= df.Registration]
print df1.groupby(df1.index)['clicks'].sum().reset_index()
User_ID clicks
0 1987293 1
1 2349876 2
2 9874452 2
答案 1 :(得分:1)
要做的第一件事是在注册日期之前过滤注册日期,然后在User_ID和总和上进行分组。
gb = (df[df.Session >= df.Registration]
.groupby('User_ID')
.clicks.agg({'Total_Clicks': np.sum}))
>>> gb
Total_Clicks
User_ID
1987293 1
2234214 7
2349876 2
9874452 2
对于您提到的用例,我相信这是可扩展的。当然,这总取决于你的可用内存。
答案 2 :(得分:0)
假设您的数据框名称为df,请执行以下操作
df.groupby(['User_ID']).sum()[['User_ID','clicks']]