我希望按组分组延迟数据框中的每一列。我有这样一个框架:
import numpy as np
import pandas as pd
index = pd.date_range('2015-11-20', periods=6, freq='D')
df = pd.DataFrame(dict(time=index, grp=['A']*3 + ['B']*3, col1=[1,2,3]*2,
col2=['a','b','c']*2)).set_index(['time','grp'])
看起来像
col1 col2
time grp
2015-11-20 A 1 a
2015-11-21 A 2 b
2015-11-22 A 3 c
2015-11-23 B 1 a
2015-11-24 B 2 b
2015-11-25 B 3 c
我希望它看起来像这样:
col1 col2 col1_lag col2_lag
time grp
2015-11-20 A 1 a 2 b
2015-11-21 A 2 b 3 c
2015-11-22 A 3 c NA NA
2015-11-23 B 1 a 2 b
2015-11-24 B 2 b 3 c
2015-11-25 B 3 c NA NA
This question管理单个列的结果,但我有任意数量的列,我想要滞后所有列。我可以使用groupby
和apply
,但apply
可以独立地在每列上运行shift
函数,而且似乎不喜欢接收[nrow, 2]
形状数据帧作为回报。是否有像apply
这样的函数作用于整个组子框架?或者有更好的方法吗?
答案 0 :(得分:6)
IIUC,你可以简单地使用level="grp"
,然后换乘-1:
>>> shifted = df.groupby(level="grp").shift(-1)
>>> df.join(shifted.rename(columns=lambda x: x+"_lag"))
col1 col2 col1_lag col2_lag
time grp
2015-11-20 A 1 a 2 b
2015-11-21 A 2 b 3 c
2015-11-22 A 3 c NaN NaN
2015-11-23 B 1 a 2 b
2015-11-24 B 2 b 3 c
2015-11-25 B 3 c NaN NaN