【问题标题】:Pandas ValueError: cannot handle a non-unique multi-index when trying to re-indexPandas ValueError:尝试重新索引时无法处理非唯一的多索引
【发布时间】:2020-07-07 10:59:02
【问题描述】:

在尝试填写所有工具的日期时,我在处理库存数据时遇到问题,因为较新的工具从一开始就没有旧工具所拥有的全部时间数据。

对于尚未获得完整时间序列数据的工具,我想用 NaN 值填写较早的日期。

这是数据导入到名为 dfo for dataframeoriginal 的数据帧后的样子:

    Date        Open        Close     High      Low     Volume      Instr_ID
0   2017-01-02  100.0000    101.0833  102.0000  99.6667 179586.0    2
1   2017-01-03  101.3333    99.7500   101.8333  99.7500 256812.0    2
2   2017-01-04  99.8333     100.1667  100.1667  99.4167 204432.0    2
3   2017-01-05  100.1667    99.9167   100.2500  99.5833  74802.0    2
4   2017-01-06  99.9167     99.9167   99.9167   99.9167      0.0    2
... ... ... ... ... ... ... ...
1182530 2020-04-07  13.2200 13.0000 13.9980 12.7200 5519.0  1932
1182531 2020-04-08  12.9000 13.1000 13.5000 12.9000 8266.0  1932
1182532 2020-04-09  13.1000 13.1000 13.1000 13.1000 0.0     1932
1182533 2020-04-14  14.0000 13.4980 14.0000 12.9000 7363.0  1932
1182534 2020-04-15  13.8000 13.8000 14.0000 13.2000 2638.0  1932

我成功地部分导出了此数据,将多索引设置为“instr_ID”和“日期”,然后创建了一个新的多索引:

df1 = dfo.set_index(["Instr_ID","Date"])

                        Open        Close       High        Low     Volume
Instr_ID    Date                    
2           2017-01-02  100.0000    101.0833    102.0000    99.6667 179586.0
            2017-01-03  101.3333    99.7500     101.8333    99.7500 256812.0
            2017-01-04  99.8333     100.1667    100.1667    99.4167 204432.0
            2017-01-05  100.1667    99.9167     100.2500    99.5833 74802.0
            2017-01-06  99.9167     99.9167     99.9167     99.9167 0.0
... ... ... ... ... ... ...
1932        2020-04-07  13.2200     13.0000     13.9980     12.7200 5519.0
            2020-04-08  12.9000     13.1000     13.5000     12.9000 8266.0
            2020-04-09  13.1000     13.1000     13.1000     13.1000 0.0
            2020-04-14  14.0000     13.4980     14.0000     12.9000 7363.0
            2020-04-15  13.8000     13.8000     14.0000     13.2000 2638.0

1182535 rows × 5 columns




start, end = df.index.levels[1].min(), df.index.levels[1].max()
date_range = pd.date_range(start, end)
new_index = pd.MultiIndex.from_product([df1.index.levels[0], date_range])
df1.reindex(index = new_index)

这在尝试部分导出数据时效果很好,并且即使对于仅从 2020 年 4 月获取数据的仪器 ID 1932 也可以填写追溯到 2017 年的日期。但是当对完整数据执行相同操作时,它会提高尝试使用 new_index 重新索引时出现以下错误:

ValueError: cannot handle a non-unique multi-index!

任何关于我可以做些什么来实现获得所有乐器的所有日期的最终目标的建议将不胜感激!

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    我第一次回答关于 stackoverflow 的问题: 我遇到了同样的问题,但我想我弄清楚了问题所在。您的多索引中可能有重复的索引。在您的情况下,这可能意味着您有重复的 Instr_ID 或者有时您的数据中有重复的日期(我认为后者:最近的仪器提供更详细的数据是有道理的)。验证您的仪器在一天内没有进行多次测量。如果有一些这样做,您只需将日期延长到日期时间或在 MultiIndex 中添加第三级以适应上午/下午。 检查提示:检查索引的长度与 df.index.unique() 的长度

    【讨论】:

      猜你喜欢
      • 2021-03-05
      • 1970-01-01
      • 2022-07-26
      • 1970-01-01
      • 2015-11-06
      • 2016-09-12
      • 2017-12-06
      • 2020-05-23
      • 2018-02-02
      相关资源
      最近更新 更多