【问题标题】:using rolling functions on multi-index dataframe in pandas在 pandas 的多索引数据帧上使用滚动函数
【发布时间】:2018-08-29 02:02:48
【问题描述】:

我在 pandas 中有一个多索引数据框,其中索引位于 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

这个输出是:

                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

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

我确信有一个函数可以帮助我在不使用循环的情况下做到这一点。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    先分组,然后滚动总和(在顶级命名空间中也可以使用 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
    

    【讨论】:

    • 似乎 pd.rolling_sum 将来会被弃用,所以在此之前,上述答案的更新方法是:df.groupby(level='IDs').apply(lambda x: x.rolling(window=2).sum())
    • 为 pandas >= 1.0 更新:df.groupby(level='IDs', group_keys=False).rolling(2).sum()
    猜你喜欢
    • 2018-12-18
    • 2015-04-23
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多