【问题标题】:Pandas MultiIndex DataFrame.rolling offsetPandas MultiIndex DataFrame.rolling 偏移量
【发布时间】:2018-02-23 21:12:25
【问题描述】:

为什么我不能在rolling 多索引DataFrame 时使用偏移量? 例如:

rng = pd.date_range('2017-01-03', periods=20, freq='8D')
i = pd.MultiIndex.from_product([['A','B','C'], rng], names=['Name','Date'])
df = pd.DataFrame(np.random.randn(60), i, columns=['Vals'])

如果我尝试使用偏移量进行分组和滚动,我会得到“ValueError: window must be an integer”:

df['Avg'] = df.groupby(['Name'])['Vals'].rolling('30D').mean() # << Why doesn't this work?

并不是说以下这些变体满足我的需求,但请注意,使用 int 进行分组和滚动是有效的:

df['Avg'] = df.groupby(['Name'])['Vals'].rolling(4).mean()

我可以在 DataFrame 的单索引子集上滚动偏移:

d = df.loc['A']
d['Avg'] = d['Vals'].rolling('30D').mean()

如果真的不可能在多索引 DataFrames 上使用偏移量进行滚动,那么将一个偏移量应用于每个 0 级索引项的最有效解决方法是什么?

【问题讨论】:

    标签: python pandas dataframe aggregate multi-index


    【解决方案1】:

    要使用像“30D”这样的偏移量,您需要一个简单的日期索引。在这种情况下,实现这一目标的最简单方法是使用reset_index(level='Name') 将“名称”移出索引,只留下“日期”作为索引:

    df['Avg'] = df.reset_index(level='Name').groupby(['Name'])['Vals'].rolling('30D').mean()
    

    【讨论】:

      猜你喜欢
      • 2018-06-03
      • 2018-09-25
      • 1970-01-01
      • 2020-08-01
      • 2018-09-09
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 2017-04-06
      相关资源
      最近更新 更多