2017-08-03 68 views
0

我有一个多指标以下数据框:添加新列使用滚动(),以大熊猫多指标数据框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() 

但它仅产生N/A为新的列(“d)中,由于数据帧分组索引的顺序是原始的相反数据帧。

我该如何解决这个问题?因为我有一个大的数据框,所以我更愿意远离堆栈/堆栈,swaplevel/sortlevel,join或concat,这些操作往往非常耗时。

回答

2

您需要reset_indexdrop参数删除多指标的第一级:

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 
... 
...