在pandas中的多索引数据框架上使用滚动函数

sil*_*cer 6 python dataframe pandas

我在pandas中有一个多索引数据框,其中index是ID和时间戳.我希望能够计算每个ID的时间序列滚动总和,但我似乎无法弄清楚如何在没有循环的情况下完成它.

content = io.BytesIO("""\
IDs    timestamp     value
0      2010-10-30     1
0      2010-11-30     2
0      2011-11-30     3
1      2000-01-01     300
1      2007-01-01     33
1      2010-01-01     400
2      2000-01-01     11""")
df = pd.read_table(content, header=0, sep='\s+', parse_dates=[1])
df.set_index(['IDs', 'timestamp'], inplace=True)
pd.stats.moments.rolling_sum(df,window=2
Run Code Online (Sandbox Code Playgroud)

而这个输出是:

                value
IDs timestamp
0   2010-10-30    NaN
    2010-11-30      3
    2011-11-30      5
1   2000-01-01    303
    2007-01-01    333
    2010-01-01    433
2   2000-01-01    411
Run Code Online (Sandbox Code Playgroud)

注意边缘处的ID 0和1以及1和2之间的重叠(我不希望这样,弄乱我的计算).解决此问题的一种可能方法是在ID上使用groupby,然后循环遍历该groupby,然后应用rolling_sum.

我确信有一个函数可以帮助我在不使用循环的情况下执行此操作.

Jef*_*eff 8

首先分组,然后滚动总和(也rolling_sum可以在顶级命名空间中使用)

In [18]: df.groupby(level='IDs').apply(lambda x: pd.rolling_sum(x,2))
Out[18]: 
                value
IDs timestamp        
0   2010-10-30    NaN
    2010-11-30      3
    2011-11-30      5
1   2000-01-01    NaN
    2007-01-01    333
    2010-01-01    433
2   2000-01-01    NaN
Run Code Online (Sandbox Code Playgroud)

  • 好像pd.rolling_sum将来会被弃用,因此在此之前,上述答案的更新方法为:`df.groupby(level ='IDs')。apply(lambda x:x.rolling(window = 2).sum())` (3认同)
  • 针对 pandas >= 1.0 进行了更新: `df.groupby(level='IDs', group_keys=False).rolling(2).sum()` (3认同)