【问题标题】:Fill date and id gaps, then lag in pandas填补 date 和 id 空白,然后在 pandas 中滞后
【发布时间】:2017-07-27 15:05:45
【问题描述】:

我有一个数据框 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    

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

谢谢!

【问题讨论】:

标签: python pandas dataframe panel lag


【解决方案1】:

让我们试试这个:

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
  • @HEMANTHKUMARGADI 最后使用fillna(0)
【解决方案2】:

您可以使用 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
日期值 ID 滞后值 0 15-6-17 3 1 南 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 南 5 16-6-17 1 2 0.0 6 17-6-17 7 2 1.0 7 18-6-17 9 2 7.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 2019-05-21
    • 2015-08-19
    • 2012-10-19
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    相关资源
    最近更新 更多