我有一个按 issues_ids 分组的数据框,我想在其中应用自定义函数。分组数据框如下所示
import pandas as pd
import numpy as np
sub_test=pd.DataFrame(columns=['issue_id','step','conversion_rate'],data=[['01-abc-234',0,0.45],['01-abc-234',1,0.35],['01-abc-234',2,0.15],['01-abc-234',3,1],['02-abc-234',0,0.05],['02-abc-234',1,0.15],['02-abc-234',2,0.65],['02-abc-234',3,1]])
sub_test.info()
我想按问题 id 分组并对每个分组的数据框应用以下函数
def calculate_conversion_step(row, df):
if row == 0:
return np.prod(df.loc[df['step'].isin([1, 2]), 'conversion_rate'])
elif row == 1:
return np.prod(df.loc[df['step'] == 2, 'conversion_rate'])
else:
return 1
基本上,我在这里所做的是迭代每个数据帧以获取各个问题 id,并将上述函数应用于过滤数据帧的每一行。我使用了 .apply() 但我的数据框太大,无法与 apply 很好地配合。
final=pd.DataFrame()
for issue_id in sub_test['issue_id'].unique():
int_df = sub_test[sub_test['issue_id'] == issue_id]
# Apply the 'calculate_conversion_step' function to calculate 'conversion_step' for each issue
int_df['conversion_step'] = int_df['step'].apply(lambda x: calculate_conversion_step(x, int_df))
# Concatenate the results for each issue
final = pd.concat([final, int_df])
无论如何我可以让它更快吗?
这本质上是
cumprod
从下往上,只需一步0..2
:
sub_test['conversion_step'] = (sub_test.query('step <= 2')
.loc[::-1]
.groupby(['issue_id'])['conversion_rate']
.apply(lambda x: x.shift(fill_value=1).cumprod())
.reindex(sub_test.index, fill_value=1)
)
输出:
issue_id step conversion_rate conversion_step
0 01-abc-234 0 0.45 0.0525
1 01-abc-234 1 0.35 0.1500
2 01-abc-234 2 0.15 1.0000
3 01-abc-234 3 1.00 1.0000
4 02-abc-234 0 0.05 0.0975
5 02-abc-234 1 0.15 0.6500
6 02-abc-234 2 0.65 1.0000
7 02-abc-234 3 1.00 1.0000