Python pandas:在groupby/apply的情况下,我们可以避免apply吗?

Python pandas: can we avoid apply in this case of groupby/apply?

提问人:BhishanPoudel 提问时间:4/3/2019 最后编辑:smciBhishanPoudel 更新时间:11/17/2023 访问量:375

问:

我听说过很多关于熊猫申请的速度很慢,应该尽可能少地使用。

在以下情况下,我需要在不使用 apply 的情况下计算列:Pct_Change_Adjusted

df = pd.DataFrame({'Date': ['2019-01-02', '2019-01-03', '2019-01-04'],
          'Fund_ID': [9072, 9072, 9072],
          'Fund_Series': ['A', 'A', 'A'],
          'Value': [1020.0, 1040.4, 1009.188],
          'Dividend': [0.0, 0.0, 52.02]})

我想在分组后做一些调整后的加权操作,如下所示:

df['Pct_Change_Adjusted'] = df.groupby(['Fund_ID', 'Fund_Series'], as_index=False) \
                              .apply(lambda x: (x.Value + x.Dividend)/(x.Value.shift()+x.Dividend.shift())  ) \
                              .reset_index(drop=True).values[0]

print(df)

         Date  Dividend  Fund_ID Fund_Series     Value  Pct_Change_Adjusted
0  2019-01-02      0.00     9072           A  1020.000                  NaN
1  2019-01-03      0.00     9072           A  1040.400                 0.02
2  2019-01-04     52.02     9072           A  1009.188                 0.02

这里是否有任何替代方案可以提高效率或至少是第二种方法?apply()

注意:我不是在谈论 dask 和其他 parallization,只是纯粹的熊猫。

熊猫 分组依据 熊猫-应用

评论

0赞 smci 11/17/2023
仅供参考:不推荐使用 .values 访问器,使用 .to_numpy() 方法

答:

6赞 cs95 4/3/2019 #1

是的,这是 100% 可矢量化的:groupby.pct_change

(df.Value + df.Dividend).groupby([df.Fund_ID, df.Fund_Series]).pct_change()

0     NaN
1    0.02
2    0.02
dtype: float64

df['Pct_Change_Adjusted'] = (df.assign(Foo=df['Value'] + df['Dividend'])
                               .groupby(['Fund_ID', 'Fund_Series'])
                               .Foo
                               .pct_change())

df

         Date  Fund_ID Fund_Series     Value  Dividend  Pct_Change_Adjusted
0  2019-01-02     9072           A  1020.000      0.00                  NaN
1  2019-01-03     9072           A  1040.400      0.00                 0.02
2  2019-01-04     9072           A  1009.188     52.02                 0.02

评论

0赞 Erfan 4/3/2019
你这样做的原因是什么?.groupby([df['Fund_ID'], df['Fund_Series']]).groupby(['Fund_ID', 'Fund_Series'])
0赞 cs95 4/3/2019
@Erfan 是的。 返回一个序列。除非我将序列赋值回 ,否则我无法将字符串传递给 groupby,我必须直接传递列/序列。为清楚起见,进行了编辑。(df.Value + df.Dividend)df
0赞 cs95 4/3/2019
在前一种情况下,我调用了 Series.GroupBy。现在,在编辑之后,我调用 DataFrame.GroupBy。