繁体   English   中英

Python Pandas - groupby() 与 apply() 和滚动() 非常慢

[英]Python Pandas - groupby() with apply() & rolling() very slow

首先,我对 Python 和 Pandas 还很陌生,所以请耐心等待,并尽可能用简单的术语回答。 另外,如果您能详细说明与我的示例中的代码不同的任何代码,或者向我指出一个可靠的参考资料,使其易于理解,我将不胜感激。

我有一个包含 60 多个列和 80 万行(并且还在增长)的月度数据数据框(df1) ,用于 6000 多个位置。 我正在尝试根据位置许可证编号('lic_num', int) 、月份('mo_yr', date)计算滚动平均值(3 个月、12 个月、YTD 等 我使用 apply() 成功地做到了这一点。 问题是 apply() 感觉很慢,需要 10 分钟。 这不是该项目的主要问题,因为这不是需要按需运行的东西,但我希望在需要更快执行项目的情况下更高效地编写与此类似的代码。 这是数据框(df1)的示例和我用来实现结果的代码

lic_num      mo_yr        ap         aw       fi
120700142 2013-03-01  228214.3  206273.53  61393.0
120700142 2013-04-01  256239.4  235296.96  64228.0
120700142 2013-05-01  247725.3  227165.09  74978.0
120700142 2013-06-01  229776.8  211765.55  64559.0
120700142 2013-07-01  229036.2  210963.06  58132.0

df1_col_list = df1.columns.tolist()

for col in df1_col_list[2:5]:
    df1[col+'_3mo'] = df1.groupby('lic_num', as_index=False).apply(
    lambda x: x.rolling(3, on='mo_yr', min_periods=1)[col].mean()).reset_index(level=0, drop=True)

lic_num      mo_yr        ap         aw       fi         ap_3mo         aw_3mo        fi_3mo
120700142 2013-03-01  228214.3  206273.53  61393.0  228214.300000  206273.530000  61393.000000
120700142 2013-04-01  256239.4  235296.96  64228.0  242226.850000  220785.245000  62810.500000
120700142 2013-05-01  247725.3  227165.09  74978.0  244059.666667  222911.860000  66866.333333
120700142 2013-06-01  229776.8  211765.55  64559.0  244580.500000  224742.533333  67921.666667
120700142 2013-07-01  229036.2  210963.06  58132.0  235512.766667  216631.233333  65889.666667

如果apply很慢,我们尽量不使用它。 这里有更多关于apply很慢的原因的信息我什么时候应该在我的代码中使用 pandas apply() ?

s=df.groupby('lic_num', as_index=False).\
       rolling(3, on='mo_yr', min_periods=1).\       
          mean().iloc[:,2:5].\
             add_suffix('_3mo').reset_index(drop=True,level=0)

df=pd.concat([df,s],axis=1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM