gpt4 book ai didi

python - 同一数据帧上的多个总和

转载 作者:行者123 更新时间:2023-12-02 09:20:39 27 4
gpt4 key购买 nike

我正在尝试对同一数据帧执行多次求和,然后将新数据帧连接到一个最终数据帧中。有没有一种简洁的方法来做到这一点,或者我是否需要使用迭代?

我有一个这种形式的字典 {key: [list_of_idx], ...} 并且需要对每个键的数据帧进行分组。

示例数据

import random
random.seed(1)

df_len = 5
df = {'idx':{i: i+1 for i in range(df_len)}, 'data':{i:random.randint(1,11) for i in range(df_len)}}
df = pd.DataFrame(df).set_index('idx')

# Groups with the idx to groupby
groups = {'a': [1,2,3,4,5],
'b': [1,4],
'c': [5]}

# I'm trying to avoid/find a faster way than this
dfs = []
for grp in groups:
_df = df.loc[groups[grp]]
_df['grp'] = grp
_df = _df.groupby('grp').sum()

dfs.append(_df)
dff = pd.concat(dfs)

输入(df)

   data  idx
0 2 1
1 10 2
2 9 3
3 3 4
4 6 5

预期输出(dff)

     data
grp
a 30
c 6
b 5

注意:我坚持使用 python 2.7 和 pandas 0.16.1

时间结果

我测试了所提出的方法并计算了执行时间。我显示了每次执行的平均时间(每个答案使用 1000 次执行):由于我的 pandas 版本,我无法测试 Quang Hoang 第一个答案。

time         method  
0.00696 sec my method (question)
0.00328 sec piRSquared (pd.concat)
0.00024 sec piRSquared (collections and defaultdict)
0.00444 sec Quang Hoang (2nd method : concat + reindex)

最佳答案

这应该(相当)快一点:

s = pd.Series(groups).explode()
df.reindex(s).groupby(s.index)['data'].sum()

输出:

a    30
b 5
c 6
Name: data, dtype: int64
<小时/>

更新:早期 pandas 版本的方法类似,尽管可能没有那么快

s = pd.concat([pd.DataFrame({'grp':a, 'idx':b}) for a,b in groups.items()],
ignore_index=True).set_index('grp')
df.reindex(s.idx).groupby(s.index)['data'].sum()

关于python - 同一数据帧上的多个总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60672399/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com