使用 rolling().max() 将新列添加到 pandas 多索引数据框

adding new column to pandas multi-index dataframe using rolling().max()

我有以下多索引数据框:

dates = pd.date_range(start='2016-01-01 09:30:00', periods=20, freq='s')
df = pd.DataFrame({'A': [1] * 20 + [2] * 12 + [3] * 8,
               'B': np.concatenate((dates, dates)),
             'C': np.arange(40)})
df = df.set_index(["B","A"])

现在我想创建一个新列作为索引 A 最后两个值的最大值。我尝试了以下操作:

df.loc[:,"D"] = df.groupby(level="A").rolling(2).max()

但它只为新列 ("D) 生成 N/A,因为分组数据帧索引的顺序与原始数据帧相反。

我该如何解决这个问题?我更喜欢远离 stacking/unstacking、swaplevel/sortlevel、join 或 concat,因为我有一个大数据框,而且这些操作往往非常耗时。

您需要 reset_indexdrop 参数才能删除第一级 MultiIndex:

df['D'] = df.groupby(level="A")['C'].rolling(2).max().reset_index(level=0, drop=True)
print (df)
                        C     D
B                   A          
2016-01-01 09:30:00 1   0   NaN
2016-01-01 09:30:01 1   1   1.0
2016-01-01 09:30:02 1   2   2.0
2016-01-01 09:30:03 1   3   3.0
2016-01-01 09:30:04 1   4   4.0
2016-01-01 09:30:05 1   5   5.0
2016-01-01 09:30:06 1   6   6.0
2016-01-01 09:30:07 1   7   7.0
2016-01-01 09:30:08 1   8   8.0
2016-01-01 09:30:09 1   9   9.0
2016-01-01 09:30:10 1  10  10.0
2016-01-01 09:30:11 1  11  11.0
2016-01-01 09:30:12 1  12  12.0
2016-01-01 09:30:13 1  13  13.0
2016-01-01 09:30:14 1  14  14.0
2016-01-01 09:30:15 1  15  15.0
2016-01-01 09:30:16 1  16  16.0
2016-01-01 09:30:17 1  17  17.0
2016-01-01 09:30:18 1  18  18.0
2016-01-01 09:30:19 1  19  19.0
2016-01-01 09:30:00 2  20   NaN
2016-01-01 09:30:01 2  21  21.0
...
...

因为:

print (df.groupby(level="A")['C'].rolling(2).max())
A  B                    A
1  2016-01-01 09:30:00  1     NaN
   2016-01-01 09:30:01  1     1.0
   2016-01-01 09:30:02  1     2.0
   2016-01-01 09:30:03  1     3.0
   2016-01-01 09:30:04  1     4.0
   2016-01-01 09:30:05  1     5.0
   2016-01-01 09:30:06  1     6.0
   2016-01-01 09:30:07  1     7.0
   2016-01-01 09:30:08  1     8.0
   2016-01-01 09:30:09  1     9.0
   2016-01-01 09:30:10  1    10.0
   2016-01-01 09:30:11  1    11.0
   2016-01-01 09:30:12  1    12.0
   2016-01-01 09:30:13  1    13.0
   2016-01-01 09:30:14  1    14.0
   2016-01-01 09:30:15  1    15.0
   2016-01-01 09:30:16  1    16.0
   2016-01-01 09:30:17  1    17.0
   2016-01-01 09:30:18  1    18.0
   2016-01-01 09:30:19  1    19.0
2  2016-01-01 09:30:00  2     NaN
   2016-01-01 09:30:01  2    21.0
...
...