Python Pandas-使用apply()和rolling()的groupby()非常慢

时间:2019-11-23 17:56:17

标签: python pandas pandas-groupby pandas-apply

首先,我对Python和Pandas并不陌生,所以请耐心等待,并以尽可能简单的方式答复。另外,如果您可以详细说明与示例中不同的代码,或者为我提供一个易于理解的可靠参考,那么我将不胜感激。

我有一个月度数据的数据框(df1),其中有60多个列和80万行(且正在增长),用于6000多个位置。我正在尝试根据位置许可证编号('lic_num',int),月份('mo_yr',日期)计算滚动平均值(3个月,12个月,年初至今等) )。我已经成功使用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

1 个答案:

答案 0 :(得分:4)

如果apply较慢,我们尝试不使用它。这是有关apply缓慢When should I ever want to use pandas apply() in my code?

的原因的更多信息
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)