【问题标题】:Groupby and lag all columns of a dataframe?Groupby并滞后数据框的所有列?
【发布时间】:2015-11-25 10:46:57
【问题描述】:

我想按组滞后数据框中的每一列。我有一个这样的框架:

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 这样的函数作用于整个组子帧?或者有更好的方法吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    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
    

    【讨论】:

    • 太好了,谢谢,我不记得为什么我认为我需要用apply 来做这件事——也许稍后会来找我。
    • Hrm.. 我刚刚意识到我尝试不同方式的原因是因为.shift(periods=1, freq='1D') 格式不适用于.groupby - 我实际上已经reported this as a bug - 一定是上周过得很糟糕。它已经在 pandas 中进行了更改,因此它给出了一个未实现的错误。人力资源管理系统。
    • 有什么想法可以采用这种完全相同的方法,但按两列而不是一列分组?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2012-04-16
    • 1970-01-01
    • 2021-07-22
    • 2019-04-12
    • 1970-01-01
    相关资源
    最近更新 更多