Pandas重采样:TypeError:仅适用于DatetimeIndex、TimedeltaIndex或PeriodIndex,但实例为'RangeIndex'。

12

请帮助我。

我想基于1D进行重新采样。我有以下的数据格式,想使用Pandas中的重新采样方法。

我想基于日期和产品重新采样,并填充缺失值。

但是我一直遇到这个错误:我尝试了5种选项后,错误始终只在“instance of”之后更改:我看到了MultiIndex、Index等。

TypeError:必须使用DatetimeIndex、TimedeltaIndex或PeriodIndex才有效,但却得到了“RangeIndex”的实例。

product value   date
A   1.52    2016-01-01
A   NULL    2016-09-20
A   1.33    2018-08-02
B   1.30    2016-01-01
B   NULL    2017-01-02
B   1.54    2017-03-10
B   2.08    2017-06-28
B   2.33    2018-08-02

我将这些数据输入

df.reset_index().set_index('date','sku')  
df= df.groupby('product').resample('1D')['value'].ffill().bfill().ffill()

我也尝试了:

df = df.set_index(['date','sku'])
df = df.set_index('date','sku')
df = df.reset_index().set_index(['date','sku'])  

请问,你能告诉我我做错了什么吗?谢谢!

今天早上我在处理这些数据,并尝试执行Jezrael给出的指令:

df = df.set_index('date').groupby('product').resample('1D')['value'].ffill()

    product value   date
   0    A   1.52    2016-01-01
   1    A   NaN 2016-09-20 
   2    A   1.87    2018-08-02
   3    B   2.33    2016-01-01
   4    B   NaN 2016-09-20
   5    B   4.55    2018-08-02

但是突然间不再这样了。 现在错误声明中有索引。

1个回答

18

如果要使用DataFrameGroupBy.resample,则需要使用DatetimeIndex。此外,由于存在可能仅为NaN的组,因此省略了bfill,这些数据将从其他组中替换:

#if necessary convert to datetimes 
#df['date'] = pd.to_datetime(df['date'])

df = df.set_index('date').groupby('product').resample('1D')['value'].ffill()
print (df)
product  date      
A        2016-01-01    1.52
         2016-01-02    1.52
         2016-01-03    1.52
         2016-01-04    1.52
         2016-01-05    1.52
         2016-01-06    1.52
         2016-01-07    1.52
         2016-01-08    1.52
         2016-01-09    1.52
         2016-01-10    1.52
         2016-01-11    1.52
         2016-01-12    1.52

为了更好地解释,已经修改了示例

print (df)
  product  value       date
0       A   1.52 2016-01-01
1       A    NaN 2016-01-03
2       B    NaN 2017-01-02
3       B    NaN 2017-01-03
4       C   1.54 2017-03-10
5       C   2.08 2017-03-12
6       C   2.33 2017-03-14

df1 = df.set_index('date').groupby('product').resample('1D')['value'].ffill()
print (df1)
product  date      
A        2016-01-01    1.52
         2016-01-02    1.52
         2016-01-03     NaN < NaN is not changed because in original data
B        2017-01-02     NaN <- only NaN group B
         2017-01-03     NaN
C        2017-03-10    1.54
         2017-03-11    1.54
         2017-03-12    2.08
         2017-03-13    2.08
         2017-03-14    2.33
Name: value, dtype: float64

df11 = df.set_index('date').groupby('product').resample('1D')['value'].ffill().bfill()
print (df11)
product  date      
A        2016-01-01    1.52
         2016-01-02    1.52
         2016-01-03    1.54 <- back filling value from group C
B        2017-01-02    1.54 <- back filling value from group C
         2017-01-03    1.54 <- back filling value from group C
C        2017-03-10    1.54
         2017-03-11    1.54
         2017-03-12    2.08
         2017-03-13    2.08
         2017-03-14    2.33
Name: value, dtype: float64

1
嗨Jezrael,这太棒了!感谢您的出色解释。我不知道以前它是如何工作的...只是为了澄清,我需要将索引仅设置为时间,然后按我想要重新采样的值进行分组,对吗?非常感谢! - HeadOverFeet
@HeadOverFeet - 嗯,也许是数据有所改变?如果使用 print(df.head()),它总是返回相同的数据集吗? - jezrael
2
@HeadOverFeet - 所以需要将 df['date'] = pd.to_datetime(df['date']) 作为第一步。 - jezrael
1
谢谢!我刚刚在谷歌上搜索它!太好了。我不明白为什么第一次登录系统时会这样做。哦,亲爱的!谢谢。 - HeadOverFeet
1
@jezrael 在该网站上给出的最佳答案之一。太棒了!谢谢! - amalik2205
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接