在多索引数据框中移动列时,会出现日期错误。

问题描述 投票:0回答:1

我想移动一个多指数数据框中的一列,以便计算一个滞后独立变量的回归模型。由于我的时间序列有缺失值,我只想移动已知前几天的值。df看起来是这样的。

                cost
ID  day
1   31.01.2020  0
1   03.02.2020  0
1   04.02.2020  0.12
1   05.02.2020  0
1   06.02.2020  0
1   07.02.2020  0.08
1   10.02.2020  0
1   11.02.2020  0
1   12.02.2020  0.03
1   13.02.2020  0.1
1   14.02.2020  0

所需的输出是这样的

                cost   cost_lag
ID  day
1   31.01.2020  0      NaN
1   03.02.2020  0      NaN
1   04.02.2020  0.12   0
1   05.02.2020  0      0.12
1   06.02.2020  0      0
1   07.02.2020  0.08   0
1   10.02.2020  0      NaN
1   11.02.2020  0      0
1   12.02.2020  0.03   0
1   13.02.2020  0.1    0.03
1   14.02.2020  0      0.1 

基于 这个问题的答案 我试过以下方法。

df['cost_lag'] = df.groupby(['id'])['cost'].shift(1)[df.reset_index().day == df.reset_index().day.shift(1) + datetime.timedelta(days=1)]

但结果是一个我不明白的错误信息。

IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match

我也试过按照一个建议的方法来填写缺失的日期。此处:

ams_spend_ranking_df = ams_spend_ranking_df.index.get_level_values(1).apply(lambda x: datetime.datetime(x, 1, 1))

再次导致错误信息,但这并没有给我任何启发。

AttributeError: 'DatetimeIndex' object has no attribute 'apply'

长话短说问:如果我没有前一天的数据,如何将成本列移动一天并添加NaNs?

python pandas time-series missing-data multi-index
1个回答
2
投票

你可以通过以下方式添加所有缺失的日期时间 DataFrameGroupBy.resampleResampler.asfreq:

df1 = df.reset_index(level=0).groupby(['ID'])['cost'].resample('d').asfreq()
print (df1)
ID  day       
1   2020-01-31    0.00
    2020-02-01     NaN
    2020-02-02     NaN
    2020-02-03    0.00
    2020-02-04    0.12
    2020-02-05    0.00
    2020-02-06    0.00
    2020-02-07    0.08
    2020-02-08     NaN
    2020-02-09     NaN
    2020-02-10    0.00
    2020-02-11    0.00
    2020-02-12    0.03
    2020-02-13    0.10
    2020-02-14    0.00
Name: cost, dtype: float64

因此,如果使用您的解决方案与 DataFrameGroupBy.shift 它的工作像需要。

df['cost_lag'] = df1.groupby('ID').shift(1)
print (df)
               cost  cost_lag
ID day                       
1  2020-01-31  0.00       NaN
   2020-02-03  0.00       NaN
   2020-02-04  0.12      0.00
   2020-02-05  0.00      0.12
   2020-02-06  0.00      0.00
   2020-02-07  0.08      0.00
   2020-02-10  0.00       NaN
   2020-02-11  0.00      0.00
   2020-02-12  0.03      0.00
   2020-02-13  0.10      0.03
   2020-02-14  0.00      0.10
© www.soinside.com 2019 - 2024. All rights reserved.