[英]Sum of a column in Pandas DataFrame
我有一個Pandas DataFrame。
LeafId pidx pidy count
1 x y 10
1 x y 20
1 x z 30
3 b q 10
1 x y 20
我們可以看到pidx = x and pidy = y
有多行
我想對count列求和並獲得dataframe df2作為:
LeafId pidx pidy count
1 x y 50
1 x z 30
3 b q 10
我知道一種方法:
df2 = df.groupby(['pidx','pidy']).agg({'LeafID':'first',count':'sum'}).reset_index()
但是我想要最有效的方式來處理龐大的DataFrame(數百萬條記錄),而這將花費最少的時間。
有什么更好的方法嗎?
另外, LeafID
將LeafID
放在.agg()
,我還可以執行以下操作嗎?
df2 = df.groupby(['LeafID','pidx','pidy']).agg({count':'sum'}).reset_index()
如果需要groupby
通過LeafId
, pidx
和pidy
列:
df1 = df.groupby(['LeafId','pidx','pidy'], as_index=False)['count'].sum()
print (df1)
LeafId pidx pidy count
0 1 x y 50
1 1 x z 30
2 3 b q 10
我嘗試一些時間 :
np.random.seed(123)
N = 1000000
L1 = list('abcdefghijklmnopqrstu')
L2 = list('efghijklmnopqrstuvwxyz')
df = pd.DataFrame({'LeafId':np.random.randint(1000, size=N),
'pidx': np.random.choice(L1, N),
'pidy': np.random.choice(L2, N),
'count':np.random.randint(1000, size=N)})
#print (df)
print (df.groupby(['LeafId','pidx','pidy'], as_index=False)['count'].sum())
print (df.groupby(['LeafId','pidx','pidy']).agg({'count':'sum'}).reset_index())
In [261]: %timeit (df.groupby(['LeafId','pidx','pidy'], as_index=False)['count'].sum())
1 loop, best of 3: 544 ms per loop
In [262]: %timeit (df.groupby(['LeafId','pidx','pidy']).agg({'count':'sum'}).reset_index())
1 loop, best of 3: 466 ms per loop
較小的組1000
到10000
:
np.random.seed(123)
N = 1000000
L1 = list('abcdefghijklmnopqrstu')
L2 = list('efghijklmnopqrstuvwxyz')
df = pd.DataFrame({'LeafId':np.random.randint(10000, size=N),
'pidx': np.random.choice(L1, N),
'pidy': np.random.choice(L2, N),
'count':np.random.randint(10000, size=N)})
print (df)
print (df.groupby(['LeafId','pidx','pidy'], as_index=False)['count'].sum())
print (df.groupby(['LeafId','pidx','pidy']).agg({'count':'sum'}).reset_index())
In [264]: %timeit (df.groupby(['LeafId','pidx','pidy'], as_index=False)['count'].sum())
1 loop, best of 3: 933 ms per loop
In [265]: %timeit (df.groupby(['LeafId','pidx','pidy']).agg({'count':'sum'}).reset_index())
1 loop, best of 3: 775 ms per loop
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.