Python 数据帧中某列的总和
我有一个熊猫数据框Python 数据帧中某列的总和,python,pandas,Python,Pandas,我有一个熊猫数据框 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和pidy=y 我想对count列求和,得到数据帧df2,如下所示: LeafId pidx pidy coun
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和pidy=y
我想对count列求和,得到数据帧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()
但是我想要一种最有效的方法来处理一个巨大的数据帧(数百万条记录),这将花费最少的时间
有没有更好的办法
另外,我可以执行以下操作,而不是将LeafID
放入.agg()
df2 = df.groupby(['LeafID','pidx','pidy']).agg({count':'sum'}).reset_index()
如果需要
groupby
byleaveid
,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
2个问题,我的.agg方法有效吗?如果有效,你的答案会比.agg快吗?@SRingne试试看。因为你说你的DF很大。让我们知道时间安排。@jezrael
.sum()
和explicitcolumn.sum()
在这里会有所不同,因为只有一列?@MYGz-我想是的,最好为sum指定列,但如果只有4列
数据帧,它是相同的。@SRingne-谢谢你的评论,agg
会快一点,但差别很小。按pidx和pidy排序,找出其中任何一个变化的指数,然后对范围进行求和。