【发布时间】:2020-12-03 22:51:00
【问题描述】:
我有一个规范的 Pandas transform 示例,其中性能似乎莫名其妙地慢。我已经阅读了Q&A on the apply method,这是相关的,但在我看来,它为我的问题提供了一个不完整且可能具有误导性的答案,如下所述。
我的数据框的前五行是
id 日期 xvar 0 1004 1992-05-31 4.151628 1 1004 1993-05-31 2.868015 2 1004 1994-05-31 3.043287 3 1004 1995-05-31 3.189541 4 1004 1996-05-31 4.008760- 数据框中有 24,693 行。
- 有 2,992 个唯一的
id值。
我想以id 居中xvar。
方法 1 耗时 861 毫秒:
df_r['xvar_center'] = (
df_r
.groupby('id')['xvar']
.transform(lambda x: x - x.mean())
)
方法 2 需要 9 毫秒:
# Group means
df_r_mean = (
df_r
.groupby('id', as_index=False)['xvar']
.mean()
.rename(columns={'xvar':'xvar_avg'})
)
# Merge group means onto dataframe and center
df_w = (
pd
.merge(df_r, df_r_mean, on='id', how='left')
.assign(xvar_center=lambda x: x.xvar - x.xvar_avg)
)
Q&A on the apply method 建议尽可能依赖矢量化函数,就像@sammywemmy 的评论所暗示的那样。我认为这是重叠的。但是,Q&A on the apply method 也表示:
"...这里有一些常见的情况,您希望摆脱对
apply...Numeric Data"的任何调用
@sammywemmy 的评论在他们对我的问题的回答中并没有“摆脱对transform 方法的任何调用”。相反,答案依赖于transform 方法。因此,除非@sammywemmy 的建议严格由不依赖transform 方法的替代方法主导,否则我认为我的问题及其答案与Q&A on the apply method 中的讨论完全不同。 (感谢您的耐心和帮助。)
【问题讨论】:
-
避免匿名函数,使用
df.xvar - df.groupby("id")["xvar"].transform("mean") -
@sammywemmy。非常感谢。您的方法在 3 毫秒内执行,并且比我的任何方法都更具 Pythonic。这是我的第一个问题,所以如果我能做任何其他事情来感谢您的有用(和快速)回复,请告诉我。
-
@MRR,没关系。很高兴它对你有效。只需通过帮助别人来支付它。干杯
-
我看到了我的问题和linked question 之间的联系,但我很惊讶它被认为是重复的。 @sammywemmy 的建议是否从另一个问题的答案中显而易见? (我不这么认为。)
标签: python pandas performance transform