首页 > 解决方案 > 具有滚动平均值的熊猫 groupby 列,在日期时间之间受限,无需遍历每一行

问题描述

我在数据框中有如下数据:

ROWS = 1000
df = pandas.DataFrame() 
df['DaT'] = pandas.date_range('2000-1-1', periods=ROWS, freq='H')
df['cat'] = numpy.random.choice(['a','b','c'],size=ROWS)    
df['val'] = numpy.random.randint(2,size=ROWS)
df['r10'] = df.groupby(['cat'])['val'].apply(lambda x: x.rolling(10).mean() )

我需要计算一个按类别“cat”分组的列,并且是值“val”列的滚动(10 个周期)平均值,但给定行的滚动平均值不能包括它发生之日的值。

可以按如下方式生成所需的结果('wanted'):

df['wanted'] = numpy.nan
for idx, row in df.iterrows():    
    Rdate = row['DaT'].normalize() 
    Rcat  = row['cat']
    try:     df.loc[idx,'wanted'] = df[(df['DaT'] < Rdate) & (df['cat'] == Rcat) ]['val'].rolling(10).mean().iloc[-1]
    except:  df.loc[idx,'wanted'] = numpy.nan

以上是一个糟糕的解决方案,但得到了结果。对于需要通过的 100000+ 行,它非常慢。有没有更优雅的解决方案?我尝试使用 shift 甚至 quantize 的组合来获得更有效的解决方案,但还没有成功

标签: pythonpandaspandas-groupby

解决方案


推荐阅读