2017-07-27 101 views
1

我有一个数据帧df1,它由跨时间的实体及其相应的值组成。 df1看起来像这样:填充日期和ID差距,然后在熊猫中滞后

Index  Date ID Values   
    0  2016-11-15 1  3 
    1  2016-11-16 1  5 
    2  2016-11-16 2  6 
    3  2016-11-17 2  7    
    4  2016-11-18 2  2 

显然,这两个ID在日期中存在差距。
我想首先填写日期和ID的差距,所以它看起来是这样的:

Index  Date ID Values   
    0  2016-11-15 1  3 
    1  2016-11-16 1  5 
    2  2016-11-17 1  0 
    3  2016-11-18 1  0 
    4  2016-11-15 2  0 
    5  2016-11-16 2  6 
    6  2016-11-17 2  7    
    7  2016-11-18 2  2  

然后,我要那么它使用前一天的价值对每个ID创建“值”滞后列:

Index  Date ID Values Lagged Values   
    0  2016-11-15 1  3   Nan 
    1  2016-11-16 1  5   3 
    2  2016-11-17 1  0   5 
    3  2016-11-18 1  0   0 
    4  2016-11-15 2  0   Nan 
    5  2016-11-16 2  6   0 
    6  2016-11-17 2  7   6 
    7  2016-11-18 2  2   7 

谢谢!

+0

你见过https://stackoverflow.com/a/32275705吗? – Zero

回答

0

让我们试试这个:

df2 = (df1.set_index('Date') 
      .groupby('ID') 
      .apply(lambda x: x.reindex_axis(pd.date_range(df1.Date.min(), df1.Date.max()))) 
      .drop('ID', axis=1) 
      .fillna(0)) 

df2['Lagged Values'] = (df2.groupby('ID',as_index=False) 
          .apply(lambda x: x.shift(1).Values) 
          .reset_index(level=0, drop=True)) 

print(df2.reset_index()) 

输出:

ID level_1 Values Lagged Values 
0 1 2016-11-15  3.0   NaN 
1 1 2016-11-16  5.0   3.0 
2 1 2016-11-17  0.0   5.0 
3 1 2016-11-18  0.0   0.0 
4 2 2016-11-15  0.0   NaN 
5 2 2016-11-16  6.0   0.0 
6 2 2016-11-17  7.0   6.0 
7 2 2016-11-18  2.0   7.0 
0

您可以使用cumcount +1摆脱日期的ID列,然后你可以使用numpy的并基于cumcount = 0,即
示例设置楠列:

import numpy as np 
df = pd.DataFrame({'Date':['15-6-17','16-6-17','17-6-17','18-6-17','15-6-17','16-6-17','17-6-17','18-6-17'],"Values":[3,5,7,0,0,1,7,9]}) 
df['ID'] = df.groupby(['Date']).cumcount()+1 
df['Lagged Values'] = np.insert(df.Values.values,0,0)[:-1] 
df.loc[df.groupby(["ID"]).cumcount() == 0,'Lagged Values']= np.nan 
  
     Date Values ID Lagged Values 
0 15-6-17  3 1   NaN 
1 16-6-17  5 1   3.0 
2 17-6-17  7 1   5.0 
3 18-6-17  0 1   7.0 
4 15-6-17  0 2   NaN 
5 16-6-17  1 2   0.0 
6 17-6-17  7 2   1.0 
7 18-6-17  9 2   7.0