[英]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你可以使用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
編輯:
正如亞歷山大指出的那樣,如果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.