gpt4 book ai didi

python - Pandas 变换方法执行缓慢

转载 作者:行者123 更新时间:2023-12-04 15:20:36 24 4
gpt4 key购买 nike

我有一个规范的 Pandas transform性能似乎莫名其妙地缓慢的示例。我已阅读 Q&A on the apply method ,这是相关的,但在我看来,它为我的问题提供了一个不完整且可能具有误导性的答案,我将在下面解释。
我的数据框的前五行是

    id      date        xvar0   1004    1992-05-31  4.1516281   1004    1993-05-31  2.8680152   1004    1994-05-31  3.0432873   1004    1995-05-31  3.1895414   1004    1996-05-31  4.008760
  • There are 24,693 rows in the dataframe.
  • There are 2,992 unique id values.

I want to center xvar by id.

Approach 1 takes 861 ms:

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还说:

"...here are some common situations where you will want to get rid of any calls to apply...Numeric Data"


@sammywemmy 的评论并没有“摆脱对 transform 的任何调用”方法在他们回答我的问题。相反,答案依赖于 transform方法。因此,除非@sammywemmy 的建议严格由不依赖于 transform 的替代方法主导。方法,我认为我的问题及其答案与 Q&A on the apply method 中的讨论完全不同。 . (感谢您的耐心和帮助。)

最佳答案

这个答案是由于@sammywemmy 的有见地的评论,他应该得到所有的信任,没有任何不准确之处。因为transform的类似用法在 Pandas User's Guide 中进行了说明,我认为详细说明可能对其他人有用。
我的假设是问题在于使用非矢量化函数和大量组的组合。当我更改 groupby来自 id 的变量(2,992 个唯一值)到 year (由 date 变量构建并包含 28 个唯一值),我的原始方法与 @sammywemmy 的性能差异显着缩小,但仍然很显着。

%%timeit
df_r['xvar_center_y'] = (
df_r
.groupby('year')['xvar']
.transform(lambda x: x - x.mean())
)
11.4 ms ± 202 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
对比
%timeit df_r['xvar_center_y'] = df_r.xvar - df_r.groupby('year')['xvar'].transform('mean')
1.69 ms ± 5.11 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
@sammywemmy 洞察力的美妙之处在于,它很容易应用于其他常见的转换,以实现潜在的显着性能改进,并且附加代码的成本适中。例如,考虑标准化一个变量:
%%timeit
df_r['xvar_z'] = (
df_r
.groupby('id')['xvar']
.transform(lambda x: (x - x.mean()) / x.std())
)
1.34 s ± 38 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
对比
%%timeit 
df_r['xvar_z'] = (
(df_r.xvar - df_r.groupby('id')['xvar'].transform('mean'))
/ df_r.groupby('id')['xvar'].transform('std')
)
3.96 ms ± 297 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

关于python - Pandas 变换方法执行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63406167/

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