填补日期和 ID 空白,然后滞后 pandas

Fill date and id gaps, then lag in pandas

我有一个数据框 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 的日期存在差距。
我首先想填补日期和 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    

然后,我想为 "Values" 创建一个滞后列,以便它为每个 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

谢谢!

您可以使用 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

让我们试试这个:

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