熊猫重新索引并填补缺失值:“索引必须是单调的”

时间:2016-06-23 04:08:27

标签: python pandas reindex

在回答this stackoverflow question时,我在重建索引数据帧时使用填充方法时发现了一些有趣的行为。

大熊猫中的old bug report表示df.reindex(newIndex,method='ffill')应该等同于df.reindex(newIndex).ffill(),但这不是我正在目睹的行为

以下是说明行为

的代码段
df = pd.DataFrame({'values': 2}, index=pd.DatetimeIndex(['2016-06-02', '2016-05-04', '2016-06-03']))
newIndex = pd.DatetimeIndex(['2016-05-04', '2016-06-01', '2016-06-02', '2016-06-03', '2016-06-05'])
print(df.reindex(newIndex).ffill())
print(df.reindex(newIndex, method='ffill'))

第一个print语句按预期工作。第二个提出了

ValueError: index must be monotonic increasing or decreasing

这里发生了什么?

编辑:请注意,示例df 故意具有非单调索引。问题涉及df.reindex(newIndex, method='ffil')中的操作顺序。我的期望是因为错误报告说它应该工作 - 首先用新索引重新索引然后填充。

如您所见,newIndex.is_monotonicTrue,填充在单独调用时有效,但在作为reindex的参数调用时失败。

2 个答案:

答案 0 :(得分:3)

reindex的某些元素需要对传入的索引进行排序。我推断,当method通过时,它无法预先输入索引并随后失败。我基于这样的事实得出了这个结论:

print df.sort_index().reindex(newIndex.sort_values(), method='ffill')

答案 1 :(得分:3)

似乎这也需要在列上完成。

In[76]: frame = DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'],columns=['Ohio', 'Texas', 'California'])

In[77]: frame.reindex(index=['a','b','c','d'],method='ffill',columns=states)
---> ValueError: index must be monotonic increasing or decreasing

In[78]: frame.reindex(index=['a','b','c','d'],method='ffill',columns=states.sort())

Out[78]:
  Ohio  Texas  California
a     0      1           2
b     0      1           2
c     3      4           5
d     6      7           8