在 pandas 中向量化应用函数

问题描述 投票:0回答:1

我有一个按 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])

无论如何我可以让它更快吗?

这是我的预期输出

python pandas vectorization apply
1个回答
0
投票

这本质上是

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
© www.soinside.com 2019 - 2024. All rights reserved.