ValueError: не может переиндексировать дублирующуюся ось при назначении нового столбца пандам DataFrame - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь выяснить, какие часы в моем индексе даты и времени находятся между двумя разными часами.

Это мой код:

rbe60['result'] = rbe60.index.hour.to_series().between(3,23)

Единственная проблема в том, что я получаю эту ошибку.

    raise ValueError("cannot reindex from a duplicate axis")
ValueError: cannot reindex from a duplicate axis

Я просмотрел некоторые другие посты и понял, что это означает, что у меня, вероятно, есть дублирующее значение где-то в моем индексе или столбцах.Я пытался бежать, чтобы увидеть, где будут дубликаты, но оба оказались пустыми.

dup = rbe60.index.get_duplicates() and 
dup = rbe60.columns.get_duplicates()

Есть ли что-то еще, что я должен попробовать?

Еще немного о том, что я пытаюсь сделать:

Вот мои данные, и япросто пытаюсь добавить условие в оператор np.logical, который проверяет, что час моего индекса данных между 3 и 23.

                       Open       H       L       C       O
DateTime                                                   
2013-12-30 14:30:00 -0.0756 -0.0729 -0.0756 -0.0737  2.8847
2013-12-30 15:30:00 -0.0735  -0.072 -0.0737 -0.0722  2.8870
2013-12-30 16:30:00 -0.0722 -0.0721 -0.0728 -0.0722  2.8930
2013-12-30 18:00:00 -0.0728 -0.0728 -0.0728 -0.0728  2.8826
2013-12-30 19:00:00 -0.0721 -0.0721 -0.0721 -0.0721  2.8872

1 Ответ

0 голосов
/ 05 декабря 2018

Причиной ошибки является выравнивание индекса.Ваш DataFrame состоит из индекса datetime s.Ваш существующий код возвращает что-то похожее на:

print(rbe60.index.hour.to_series().between(3,23))
DateTime
14    True
15    True
16    True
18    True
19    True
Name: DateTime, dtype: bool

Обратите внимание, что значения индекса не совпадают со значениями оригинала.Это отбрасывает панд во время задания.Решение состоит в том, чтобы назначить массив, который вообще не связан с индексом.

print(rbe60.index.hour.to_series().between(3,23).values)
array([ True,  True,  True,  True,  True])

IOW,

rbe60['result'] = rbe60.index.hour.to_series().between(3,23).values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...