Pandas DataFrame 按日期移动列以创建滞后值

Cry*_*tie 2 python dataframe pandas panel-data

我有一个数据框:

df = pd.DataFrame({'year':[2000,2000,2000,2001,2001,2002,2002,2002],'ID':['a','b','c','a','b','a','b','c'],'values':[1,2,3,4,5,7,8,9]})
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想创建一个列,其中包含每个 ID 年的滞后值,例如,2000 年的 ID'a' 的值为 1,因此 2001 年的 ID'a' 的预值为 1。关键点是,如果一个 ID 在前一年没有值(因此某些 ID 的年份不连续),则预值应该为 NaN,而不是两年前的值。例如,ID'c' 在 2001 年没有出现,那么对于 2002 年,ID'c' 的预值应该 = NaN。理想情况下,最终输出应如下所示: 在此输入图像描述

我尝试了 df.groupby(['ID'])['values'].shift(1),但它给出了以下内容: 在此输入图像描述

问题是,当 ID'c' 没有一年前的值时,将使用两年前的值。我还尝试了多索引移位,这给了我相同的结果。

df.set_index(['year','ID'], inplace = True)
df.groupby(level=1)['values'].shift(1)
Run Code Online (Sandbox Code Playgroud)

有效的就是这里提到的答案。但由于我的数据帧相当大,合并会杀死内核。到目前为止,我还没有找到更好的方法。我希望我清楚地解释了我的问题。

Psi*_*dom 5

假设year每个id的列都是唯一的,即每个特定id没有重复的年份,那么您可以先移动该值,然后替换当前行和上一行的年份之间的差异不等于的移动值1NaN

import pandas as pd
import numpy as np
df['pre_value'] = df.groupby('ID')['values'].shift(1)
df['pre_value'] = df.pre_value.where(df.groupby('ID').year.diff() == 1, np.nan)
df
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述