Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧中某列的总和_Python_Pandas - Fatal编程技术网

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
by
leaveid
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()
和explicit
column.sum()
在这里会有所不同,因为只有一列?@MYGz-我想是的,最好为sum指定列,但如果只有
4列
数据帧,它是相同的。@SRingne-谢谢你的评论,
agg
会快一点,但差别很小。按pidx和pidy排序,找出其中任何一个变化的指数,然后对范围进行求和。