如何通过几列中的唯一索引在pandas中求和?

时间:2016-02-10 05:44:45

标签: python pandas sum aggregate

我有一个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万条记录,这是否有规模?

3 个答案:

答案 0 :(得分:7)

IIUC您可以使用groupbysumreset_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_IDindex

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']]