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

时间:2016-10-12 19:42:32

标签: python pandas dataframe 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]})

enter image description here

我想创建一个具有每个ID年的滞后值的列,例如,2000年的ID'a'值为1,因此2001年的ID'a'应具有预值1.关键是如果一个ID在前一年没有值(因此某些ID的年份不连续),那么预值应该是NaN,而不是两年前的值。例如,ID'c'在2001年没有出现,那么在2002年,ID'c'应该具有预值= NaN。 理想情况下,最终输出应如下所示: enter image description here

我尝试了df.groupby(['ID'])['values']。shift(1),但它给出了以下内容: enter image description here

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

df.set_index(['year','ID'], inplace = True)
df.groupby(level=1)['values'].shift(1)

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

2 个答案:

答案 0 :(得分:3)

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

NaN

enter image description here

答案 1 :(得分:0)

reindex方法

def reindex_min_max(df):
    mn = df.year.min()
    mx = df.year.max() + 1
    d = df.set_index('year').reindex(pd.RangeIndex(mn, mx, name='year'))
    return pd.concat([d, d['values'].shift().rename('pre_value')], axis=1)

df.groupby('ID')[['year', 'values']].apply(reindex_min_max) \
    .sort_index(level=[1, 0]).dropna(subset=['values']).reset_index()

enter image description here