gpt4 book ai didi

python - 如何加快pandas中的条件groupby sum

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

我有一个包含大量行的数据框,我想对该数据框进行条件分组求和。

这是我的数据框和代码的示例:

import pandas as pd

data = {'Case': [1, 1, 1, 1, 1, 1],
'Id': [1, 1, 1, 1, 2, 2],
'Date1': ['2020-01-01', '2020-01-01', '2020-02-01', '2020-02-01', '2020-01-01', '2020-01-01'],
'Date2': ['2020-01-01', '2020-02-01', '2020-01-01', '2020-02-01', '2020-01-01', '2020-02-01'],
'Quantity': [50,100,150,20,30,35]
}

df = pd.DataFrame(data)

df['Date1'] = pd.to_datetime(df['Date1'])
df['Date2'] = pd.to_datetime(df['Date2'])

sum_list = []


for d in df['Date1'].unique():
temp = df.groupby(['Case','Id']).apply(lambda x: x[(x['Date2'] == d) & (x['Date1']<d)]['Quantity'].sum()).rename('sum').to_frame()
temp['Date'] = d
sum_list.append(temp)


output = pd.concat(sum_list, axis=0).reset_index()

当我将此 for 循环应用于真实数据帧时,速度非常慢。我想找到一种更好的方法来进行条件分组求和运算。这是我的问题:

  1. for 循环是完成我需要的操作的好方法吗?
  2. 是否有更好的方法来替换 for 循环中的第 1 行;
  3. 我觉得for循环中的第2行也很耗时,我应该如何改进它。

感谢您的帮助。

最佳答案

一个选项是双重合并和分组:

date = pd.Series(df.Date1.unique(), name='Date')
step1 = df.merge(date, left_on = 'Date2', right_on = 'Date', how = 'outer')
step2 = step1.loc[step1.Date1 < step1.Date]
step2 = step2.groupby(['Case', 'Id', 'Date']).agg(sum=('Quantity','sum'))
(df
.loc[:, ['Case', 'Id', 'Date2']]
.drop_duplicates()
.rename(columns={'Date2':'Date'})
.merge(step2, how = 'left', on = ['Case', 'Id', 'Date'])
.fillna({'sum': 0}, downcast='infer')
)

Case Id Date sum
0 1 1 2020-01-01 0
1 1 1 2020-02-01 100
2 1 2 2020-01-01 0
3 1 2 2020-02-01 35

关于python - 如何加快pandas中的条件groupby sum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72091959/

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