在回答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_monotonic
为True
,填充在单独调用时有效,但在作为reindex
的参数调用时失败。
答案 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