Pandas滚动`on`参数作为MultiIndex DataFrame的级别

iih3973s  于 2023-05-12  发布在  其他
关注(0)|答案(2)|浏览(160)

我尝试对索引为MultiIndex的序列使用pandas rolling函数。我试图将on参数设置为其中一个索引级别,但我得到了一个错误,尽管文档明确指出索引级别是一个有效的参数(“对于DataFrame,计算滚动窗口的列标签或索引级别,而不是DataFrame的索引。”)下面是一个展示错误的示例。
初始化玩具数据:

import pandas as pd
idx = pd.MultiIndex.from_arrays([[1,2,3,4], pd.date_range(start="1-1-2023", end="1-4-2023")], names=["number", "time"])
ser = pd.Series(data=[1,2,3,4], index=idx)
print(ser)

产生:

number  time
1       2023-01-01    1
2       2023-01-02    2
3       2023-01-03    3
4       2023-01-04    4
dtype: int64

当我尝试滚动设置参数on="time",试图访问MultiIndex的“时间”级别时,我得到一个错误:

out = ser.rolling("2D", on="time").mean()  # ValueError: invalid on specified as time, must be a column (of DataFrame), an Index or None

但是,如果我将索引中的“time”级别带入DataFrame列,就可以使用on="time"执行滚动,而不会出现错误。但是,我需要额外的样板文件,以便在计算完滚动对象后将其带回索引中

out = ser.reset_index("time").rolling("2D", on="time").mean()
out = out.set_index("time", append=True)
print(out)

提供:

number  time      
1       2023-01-01    1.0
2       2023-01-02    1.5
3       2023-01-03    2.5
4       2023-01-04    3.5
Name: 0, dtype: float64

有没有更干净的方法来做到这一点?

eqqqjvef

eqqqjvef1#

作为rolling as no level keyword,您可以使用on参数的解决方法:

>>> ser.rolling('2D', on=ser.index.levels[1]).mean()

number  time      
1       2023-01-01    1.0
2       2023-01-02    1.5
3       2023-01-03    2.5
4       2023-01-04    3.5
dtype: float64

如果你的time索引没有排序,你必须在以下情况下排序:

>>> ser.sort_index(level='time').rolling('2D', on=ser.index.levels[1]).mean()

number  time      
1       2023-01-01    1.0
2       2023-01-02    1.5
4       2023-01-03    3.0
3       2023-01-04    3.5
dtype: float64
wqnecbli

wqnecbli2#

可以使用Index.get_level_valuesIndex传递给参数on

out = ser.rolling("2D", on=ser.index.get_level_values("time")).mean()
print (out)
number  time      
1       2023-01-01    1.0
2       2023-01-02    1.5
3       2023-01-03    2.5
4       2023-01-04    3.5
dtype: float64
print (ser.index.get_level_values("time"))
DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04'], 
               dtype='datetime64[ns]', name='time', freq=None)

相关问题