2016-10-12 56 views
1

我有一个数据帧:按日期创建滞后大熊猫数据帧位移列中的值

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年的滞后值的列,例如,ID'a'在2000年的值为1,所以2001年的ID'a应该有1的预值。关键是如果一个ID在前一年没有价值(所以对于某些ID,年份不连续),那么前值应该是NaN,而不是两年前的值。例如,ID'c'不会在2001年出现,那么在2002年,ID'c'应该具有预值= NaN。 理想情况下,最终输出应如下所示: enter image description here

我试图df.groupby([ 'ID'])[ '值']移动(1),但它提供了以下: enter image description here

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

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

工作的事情是提到的答案here。但是由于我的数据帧相当大,合并杀死了内核。到目前为止,我还没有想出一个更好的方法来做到这一点。我希望我明确解释我的问题。

回答

2

假设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 

enter image description here

+0

感谢您的答案,它解决了我的问题。我并没有考虑取代价值观。因此,如果我的“年份”专栏是某个其他频率(月份或季度)的时间,我仍然可以对这些日期之间的差异在一定范围内进行替换调整(每月32份,每季度93份)。再次感谢。 – Crystie

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