Pandas DataFrame中列的总和

时间:2017-01-12 09:40:36

标签: python pandas

我有一个Pandas DataFrame。

df2 = df.groupby(['pidx','pidy']).agg({'LeafID':'first',count':'sum'}).reset_index()

我们可以看到有多行LeafID

我想将count列相加并将dataframe df2作为:

.agg()

我知道一种方法:

df2 = df.groupby(['LeafID','pidx','pidy']).agg({count':'sum'}).reset_index()

但是我希望以最有效的方式为巨大的DataFrame(数百万条记录)做这件事,这将花费最少的时间。

有没有更好的方法呢?

此外,我可以执行以下操作,而不是将import re my_regex = re.compile(r".+?(\d{2}-\w+-\d{4}).+?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).+?\b([\w.\d]+@[\w.\d]+)(?:\b|$)") with open("somefile") as f_logs: logs = f_logs.readlines() for line in logs: my_regex.sub(r"[\1] -- \2 -- \3",line) 放在{{1}}内吗?

{{1}}

1 个答案:

答案 0 :(得分:2)

如果groupbyLeafIdpidx列需要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

较小的群组100010000

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