簡體   English   中英

如何通過幾列中的唯一索引在pandas中求和?

[英]How to sum in pandas by unique index in several columns?

我有一個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萬條記錄,這是否有規模?

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

編輯:

正如亞歷山大指出的那樣,如果Session日期少於每個User_ID Registration日期,則需要在groupby之前過濾數據:

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

首先要做的是在注冊日期之前過濾注冊日期,然后在User_ID和sum上進行分組。

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

對於您提到的用例,我相信這是可擴展的。 當然,這總取決於你的可用內存。

假設您的數據框名稱為df,請執行以下操作

df.groupby(['User_ID']).sum()[['User_ID','clicks']]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM