我尝试对索引为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
有没有更干净的方法来做到这一点?
2条答案
按热度按时间eqqqjvef1#
作为
rolling
as nolevel
keyword,您可以使用on
参数的解决方法:如果你的
time
索引没有排序,你必须在以下情况下排序:wqnecbli2#
可以使用
Index.get_level_values
将Index
传递给参数on
: