Groupby和滞后数据帧的所有列?

时间:2015-11-25 02:30:22

标签: python pandas

我希望按组分组延迟数据框中的每一列。我有这样一个框架:

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管理单个列的结果,但我有任意数量的列,我想要滞后所有列。我可以使用groupbyapply,但apply可以独立地在每列上运行shift函数,而且似乎不喜欢接收[nrow, 2]形状数据帧作为回报。是否有像apply这样的函数作用于整个组子框架?或者有更好的方法吗?

1 个答案:

答案 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