2013-02-14 3 views
2

Вот пример задачи:панды переиндексации в dataframe с повторяющимися ключами

>>> 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 с ФР. Поскольку времена индекса не совпадают, я хочу сопоставить время df2 с ближайшим последним временем в df, которое является первой строкой. Один из искусственных способов, с которыми я столкнулся, заключался в том, чтобы добавить фальшивое микросекундное значение во второй временной ряд, чтобы он стал уникальным. Но это слишком медленно для больших фреймов данных. Есть ли какая-то особая причина, почему это не разрешено? Кажется, это логично. Есть ли лучшие способы преодолеть это ограничение?

+2

возможно вы Шоул d дать пример для исходной задачи (с индексом временного ряда). mabe есть еще один вариант для решения вашей проблемы. – bmu

+0

Я изменил свой пример, чтобы быть ближе к моей исходной проблеме. – tarotcard

+0

Я до сих пор не совсем понимаю вопрос. 'pd.concat ((df, df2))' работает, если вы хотите только объединить df. – bmu

ответ

2

Недавно у меня возникла аналогичная проблема. Я решил это, сначала удалив дубликаты от 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 
+0

Спасибо за ответ, я в конце концов подошел с тем же обходом, удалив дубликаты из df2. Фактически вы можете удалить повторяющиеся индексы, выполнив df2.groupby (df2.index) .first(). Что касается загадочного заявления, это была действительно ошибка, я не заметил, что минута была иной. – tarotcard

+0

Хороший совет по группе. Благодарю. –

Смежные вопросы