ValueError: невозможно переиндексировать дублирующую ось

У меня есть следующий ДФ:

Timestamp                            A      B      C     ...     
2014-11-09 00:00:00                     NaN     1      NaN   NaN      
2014-11-09 00:00:00                      2     NaN     NaN   NaN             
2014-11-09 00:00:00                     NaN    NaN     3     NaN   
2014-11-09 08:24:00                     NaN    NaN     1     NaN         
2014-11-09 08:24:00                     105    NaN     NaN   NaN           
2014-11-09 09:19:00                     NaN    NaN     23    NaN          

И я хотел бы сделать следующее:

Timestamp                            A      B      C     ...     
2014-11-09 00:00:00                  2      1      3     NaN      
2014-11-09 00:01:00                  NaN    NaN    NaN   NaN
2014-11-09 00:02:00                  NaN    NaN    NaN   NaN
...                                  NaN    NaN    NaN   NaN
2014-11-09 08:23:00                  NaN    NaN    NaN   NaN
2014-11-09 08:24:00                  105    NaN     1    NaN         
2014-11-09 08:25:00                  NaN    NaN     NaN  NaN     
2014-11-09 08:26:00                  NaN    NaN     NaN  NaN
2014-11-09 08:27:00                  NaN    NaN     NaN  NaN      
...                                  NaN    NaN     NaN  NaN      
2014-11-09 09:18:00                  NaN    NaN     NaN  NaN  
2014-11-09 09:19:00                  NaN    NaN     23   NaN      

То есть: я хотел бы объединить столбцы с одной и той же меткой времени (у меня 17 столбцов), выполнить повторную выборку с точностью до 1 минуты, а для тех столбцов без значений я хотел бы иметь NaN.

Я начал следующим образом:

df.groupby('Timestamp').sum()

а также

df = df.resample('1Min', how='max')

но я получил следующую ошибку:

ValueError: cannot reindex from a duplicate axis

Как я могу решить эту проблему? Я только изучаю Python, поэтому у меня совсем нет опыта.

Благодарю вас!


person Marzia    schedule 30.12.2014    source источник
comment
Является ли ваша метка времени вашим индексом?   -  person Anzel    schedule 30.12.2014


Ответы (1)


Предположим, что у вас есть Timestamp в качестве индекса для начала, вам нужно сначала выполнить повторную выборку, а reset_index перед выполнением groupby, вот рабочий образец:

import pandas as pd

df
                       A   B   C  ...
Timestamp                            
2014-11-09 00:00:00  NaN   1 NaN  NaN
2014-11-09 00:00:00    2 NaN NaN  NaN
2014-11-09 00:00:00  NaN NaN   3  NaN
2014-11-09 08:24:00  NaN NaN   1  NaN
2014-11-09 08:24:00  105 NaN NaN  NaN
2014-11-09 09:19:00  NaN NaN  23  NaN

df.resample('1Min', how='max').reset_index().groupby('Timestamp').sum()

                      A   B   C  ...
Timestamp                           
2014-11-09 00:00:00   2   1   3  NaN
2014-11-09 00:01:00 NaN NaN NaN  NaN
2014-11-09 00:02:00 NaN NaN NaN  NaN
2014-11-09 00:03:00 NaN NaN NaN  NaN
2014-11-09 00:04:00 NaN NaN NaN  NaN
...
2014-11-09 09:17:00 NaN NaN NaN  NaN
2014-11-09 09:18:00 NaN NaN NaN  NaN
2014-11-09 09:19:00 NaN NaN  23  NaN

Надеюсь это поможет.

Обновлено:

Как сказано в комментарии, ваша «Временная метка» не является датой и, вероятно, строкой, поэтому вы не можете выполнить повторную выборку с помощью DatetimeIndex, просто reset_index и преобразуйте ее примерно так:

df = df.reset_index()
df['ts'] = pd.to_datetime(df['Timestamp'])
# 'ts' is now datetime of 'Timestamp', you just need to set it to index
df = df.set_index('ts')
...

Теперь просто запустите предыдущий код еще раз, но замените «Timestamp» на «ts», и все будет в порядке.

person Anzel    schedule 30.12.2014
comment
У меня все еще та же проблема, и я не понимаю, откуда это берется. :( - person Marzia; 31.12.2014
comment
@Marzia, ваша ошибка означает, что вы пытаетесь проиндексировать существующий индекс. попробуйте: df = df.reset_index() затем запустите приведенный выше код и посмотрите, поможет ли это - person Anzel; 31.12.2014
comment
Я пытался сделать это раньше, и когда я выполняю повторную выборку с помощью df.resample('1Min', как='max'), я получаю следующее: TypeError: допустимо только с DatetimeIndex или PeriodIndex, и я не знаю, как это сделать. . - person Marzia; 01.01.2015
comment
@Marzia, я думаю, ваш df['Timestamp'] является строкой или объектом, а не DatetimeIndex. Вам нужно преобразовать ваши данные, я обновлю свой ответ - person Anzel; 01.01.2015
comment
Спасибо за обновление. К сожалению, я не помог: я все еще получаю ту же ошибку. Я не знаю, что делать. :( - person Marzia; 02.01.2015