Панды переиндексируют и заполняют пропущенные значения: «Индекс должен быть монотонным»

Отвечаяэтот вопросЯ обнаружил интересное поведение при использовании метода fill при переиндексации данных.

этостарый отчет об ошибке в пандах говорит что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'))

Первое печатное заявление работает как ожидалось. Вторая поднимает

ValueError: index must be monotonic increasing or decreasing

Что тут происходит?

РЕДАКТИРОВАТЬ: Обратите внимание, что образецdf намеренно имеет немонотонный индекс. Вопрос относится к порядку операций вdf.reindex(newIndex, method='ffil'), Я ожидаю, что в отчете об ошибках сказано, что он должен сработать - сначала переиндексировать с новым индексом, а затем заполнить.

Как видите,newIndex.is_monotonic являетсяTrueи заливка работает, когда вызывается отдельно, но завершается неудачно, когда вызывается как параметр дляreindex.

Ответы на вопрос(2)

Какой-то элементreindex требует, чтобы входящий индекс был отсортирован. Я делаю вывод, что когдаmethod пропущен, он не может предварительно отсортировать входящий индекс и впоследствии завершается ошибкой. Я делаю этот вывод, основываясь на том факте, что это работает:

print df.sort_index().reindex(newIndex.sort_values(), method='ffill')
 michael_j_ward23 июн. 2016 г., 13:26
@piRSquared было поздно, когда я написал этот вопрос вчера вечером. Обратите внимание, чтоall(newIndex.sort_values()==newIndex) являетсяTrue, Часть вашего фрагмента, которая заставляет его работать, - это вызов df.sort_index () `. Мой примерdf намеренно имеет немонотонный индекс. Мое ожидание того, какreindex(newIndex, method='ffill') будет ПЕРВЫЙ переиндексировать и затем заполнить, а не наоборот.
 michael_j_ward23 июн. 2016 г., 13:27
@ EdChum, я согласенffill на немонотонный индекс не имеет смысла. Но мойnewIndex Это монотонный. Мои ожидания наdf.reindex(newIndex, method='ffill') будет сначала переиндексировать сnewIndex и затем заполните. Но это явно не то, что происходит.
 EdChum23 июн. 2016 г., 10:15
Это действительно проблема трассировки стека:1940 indexer = self.get_indexer(target) 1941 nonexact = (indexer == -1) -> 1942 indexer[nonexact] = self._searchsorted_monotonic(target[nonexact], side) 1943 if side == 'left': 1944 # searchsorted returns "indices into a sorted array such that,  показывает, что индекс должен быть отсортирован, чтобы это работало, это имеет смысл, так как вы не можетеffill если индекс не отсортирован

Похоже, это нужно делать и на колонках.

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

 Junyong Yao01 сент. 2017 г., 04:56
Эта проблема вызвана тем, что столбец не отсортирован. Поэтому я считаю этот ответ более точным.

Ваш ответ на вопрос