pandas переиндексирует фрейм данных с дублирующимися ключами
Вот пример проблемы:
>>> df = DataFrame({'a':[1,2]},index=[datetime.today(),datetime.today()+timedelta(days=1)])
>>> df
a
2013-02-15 09:36:14.665272 1
2013-02-16 09:36:14.857322 2
>>> dup_index = datetime.today()
>>> df2 = DataFrame({'a':[2,3]},index=[dup_index,dup_index])
>>> df2
a
2013-02-15 09:37:11.701271 2
2013-02-15 09:37:11.701271 3
>>>
>>> df2.reindex(df.index,method='ffill')
Traceback (most recent call last):
...
Exception: Reindexing only valid with uniquely valued Index objects
Я хочу слить df2 с df. Поскольку времена индекса не совпадают, я хочу сопоставить время df2 с ближайшим последним временем в df, которое является первой строкой. Один искусственный способ, который я придумал, чтобы решить эту проблему, - добавить ложное значение микросекунды ко второму временному ряду, чтобы оно стало уникальным. Но это медленно для больших фреймов данных. Есть ли конкретная причина, почему это не разрешено? Это кажется логичным. Есть ли для меня лучшие способы преодолеть это ограничение?
1 ответ
Недавно я столкнулся с подобной проблемой. Я решил это, сначала удалив дубликаты из df2
, Делая это таким образом, вы думаете о том, что оставить, а что выбросить. К сожалению, у панд, похоже, нет отличного способа удаления дубликатов, основанных на повторяющихся элементах индекса, но это обходной путь (добавление столбца "индекс" к df2
) следует сделать это:
>>> df2['index'] = df2.index
>>> df3 = df2.drop_duplicates(cols='index', take_last=True).reindex(df.index, method='ffill')
>>> del df3['index']
>>> df3
a
2013-02-21 09:51:56.615338 NaN
2013-02-22 09:51:56.615357 3
Конечно, вы можете установить 'take_last=False', чтобы получить значение 2 для столбца.
Я заметил, что вы сказали: "Я хочу сопоставить время df2 с ближайшим последним разом в df, который является первым рядом". Я не совсем понял это утверждение. Ближайшее время в df ко времени в df2 - это вторая строка, а не первая строка. Если я неправильно понял ваш вопрос, дайте мне знать, и я обновлю этот ответ.
Для справки вот мои данные испытаний:
>>> df
a
2013-02-21 09:51:56.615338 1
2013-02-22 09:51:56.615357 2
>>> df2
a
2013-02-21 09:51:57.802331 2
2013-02-21 09:51:57.802331 3