You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas 1.1.5升级1.3.4后set_index/reset_index变更及兼容方案问询

问题原因

该报错是pandas 1.2版本迭代时对groupby.rolling返回结果的索引逻辑调整导致的兼容性问题:

  • pandas 1.1.x版本中,groupby.rolling返回结果的索引仅保留groupby的层级,你这里分组key是label,所以结果索引只有1个名为label的层级
  • pandas 1.2+版本中,groupby.rolling会自动把groupby key + 原数据集的完整索引拼接为新的MultiIndex,你原数据集索引已经包含label字段,所以新索引出现了两个同名的label层级,调用reset_index时就会触发字段重复的报错。
兼容pandas 1.1.5与1.3.4的解决方案

方案1:兼容原有写法,仅新增1行索引清洗逻辑

不需要修改原有set_index、groupby rolling的逻辑,只需要在reset_index前加一行代码删除重复的索引层级即可:

import pandas
from pandas import Timestamp
df = pandas.DataFrame({'label': {1000: 'apple',
  1001: 'carrot',
  1002: 'carrot',
  1003: 'apple',
  1004: 'apple',
  1005: 'carrot'},
 'date': {1000: Timestamp('2021-10-27 00:00:00'),
  1001: Timestamp('2021-10-27 00:00:00'),
  1002: Timestamp('2021-10-28 00:00:00'),
  1003: Timestamp('2021-10-28 00:00:00'),
  1004: Timestamp('2021-10-29 00:00:00'),
  1005: Timestamp('2021-10-29 00:00:00')},
 'stock': {1000: 100,
  1001: 150,
  1002: 75,
  1003: 50,
  1004: 200,
  1005: 20}})

df_rolling = df.set_index(['label', 'date']).groupby(level='label').rolling(window=7, min_periods=1).sum()
# 新增行:判断索引层级数量,删除高版本里多余的重复label层级
df_rolling.index = df_rolling.index.droplevel(0) if len(df_rolling.index.names) == 3 else df_rolling.index
df_rolling = df_rolling.reset_index()

方案2:优化写法,从根源避免重复索引

直接调整groupby rolling的写法,不需要提前set_index,指定on参数关联日期列即可,两个版本均可正常运行:

df_rolling = df.groupby('label').rolling(window=7, on='date', min_periods=1)['stock'].sum().reset_index()

内容的提问来源于stack exchange,提问作者mrkc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:54:03