填写日期和id间隙,然后在大熊猫中滞后

时间:2017-07-27 15:05:45

标签: python pandas dataframe panel lag

我有一个数据帧df1,它由跨时间的实体及其对应的值组成。 df1看起来像这样:

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空白,看起来像这样:

 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

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用cumcount +1从日期中获取ID列,然后您可以使用numpy并根据cumcount = 0将nan设置为列,即 例如:

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

答案 1 :(得分: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