Pandas ValueError:尝试重新索引时无法处理非唯一的多重索引

Joh*_*und 2 python multi-index dataframe pandas

在尝试填写所有仪器的日期时,我在处理股票数据时遇到问题,因为较新的仪器从一开始就没有旧仪器所具有的完整时间数据。

\n

我想用尚未获得完整时间序列数据的仪器的 NaN 值填写较早的日期。

\n

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

\n
    Date        Open        Close     High      Low     Volume      Instr_ID\n0   2017-01-02  100.0000    101.0833  102.0000  99.6667 179586.0    2\n1   2017-01-03  101.3333    99.7500   101.8333  99.7500 256812.0    2\n2   2017-01-04  99.8333     100.1667  100.1667  99.4167 204432.0    2\n3   2017-01-05  100.1667    99.9167   100.2500  99.5833  74802.0    2\n4   2017-01-06  99.9167     99.9167   99.9167   99.9167      0.0    2\n... ... ... ... ... ... ... ...\n1182530 2020-04-07  13.2200 13.0000 13.9980 12.7200 5519.0  1932\n1182531 2020-04-08  12.9000 13.1000 13.5000 12.9000 8266.0  1932\n1182532 2020-04-09  13.1000 13.1000 13.1000 13.1000 0.0     1932\n1182533 2020-04-14  14.0000 13.4980 14.0000 12.9000 7363.0  1932\n1182534 2020-04-15  13.8000 13.8000 14.0000 13.2000 2638.0  1932\n
Run Code Online (Sandbox Code Playgroud)\n

我成功地部分导出了该数据,将多重索引设置为“instr_ID”和“日期”,然后使用以下命令创建一个新的多重索引:

\n
df1 = dfo.set_index(["Instr_ID","Date"])\n\n                        Open        Close       High        Low     Volume\nInstr_ID    Date                    \n2           2017-01-02  100.0000    101.0833    102.0000    99.6667 179586.0\n            2017-01-03  101.3333    99.7500     101.8333    99.7500 256812.0\n            2017-01-04  99.8333     100.1667    100.1667    99.4167 204432.0\n            2017-01-05  100.1667    99.9167     100.2500    99.5833 74802.0\n            2017-01-06  99.9167     99.9167     99.9167     99.9167 0.0\n... ... ... ... ... ... ...\n1932        2020-04-07  13.2200     13.0000     13.9980     12.7200 5519.0\n            2020-04-08  12.9000     13.1000     13.5000     12.9000 8266.0\n            2020-04-09  13.1000     13.1000     13.1000     13.1000 0.0\n            2020-04-14  14.0000     13.4980     14.0000     12.9000 7363.0\n            2020-04-15  13.8000     13.8000     14.0000     13.2000 2638.0\n\n1182535 rows \xc3\x97 5 columns\n\n\n\n\nstart, end = df.index.levels[1].min(), df.index.levels[1].max()\ndate_range = pd.date_range(start, end)\nnew_index = pd.MultiIndex.from_product([df1.index.levels[0], date_range])\ndf1.reindex(index = new_index)\n
Run Code Online (Sandbox Code Playgroud)\n

当尝试部分导出数据时,此方法工作正常,并且即使对于仅从 2020 年 4 月获取数据的仪器 ID 1932,也会填写可追溯到 2017 年的日期。但是,当对完整数据执行相同操作时,它将引发以下错误当尝试使用 new_index 重新索引时:

\n
ValueError: cannot handle a non-unique multi-index!\n\n
Run Code Online (Sandbox Code Playgroud)\n

任何有关我可以采取哪些措施来实现获取所有仪器的所有日期的最终目标的建议将不胜感激!

\n

小智 5

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