Панды: Несогласованная конкатенация - PullRequest
0 голосов
/ 23 мая 2018

У меня есть две панды DataFrames с меткой даты-времени в качестве индекса под названием «datetime», а некоторые плавающие в виде столбца с именем «metric1» или «metric2».Когда я пытаюсь объединить их, я получаю следующую ошибку:

ValueError: cannot reindex from a duplicate axis

После многочасового чтения я не могу найти решение, которое решает мою проблему (например, Что означает `ValueError: не удается переиндексировать из дубликатаaxis` mean? "ValueError: невозможно переиндексировать с дублированной оси" ).

Затем я потратил много времени, пытаясь воссоздать проблему, но не смог без моих конкретных данныхно мои данные две большие, чтобы опубликовать здесь.

В конце концов, казалось, что некоторые части кадров данных были несовместимы, но другие части были в порядке.После сравнения множества фрагментов индексов я, наконец, обнаружил несовместимые множества.Может кто-нибудь, пожалуйста, помогите мне понять, почему я не могу объединить их.

В принципе, я бы хотел, чтобы все возможные метки времени были в индексе, а для столбцов «metric1» и «metric2» был столбец.Если в данный момент времени нет данных для столбца, то у нас просто NaN или что-то в этом роде.Это нормально работает с pd.concat, но в этом случае не работает.Для воссоздания используйте:

CSV-файлы:

test1.csv

timestamp,metric1
2018-03-21 15:46:36,3.5555559999999997
2018-03-21 15:47:36,5.345001
2018-03-21 15:48:36,5.719998

test2.csv

timestamp,metric2
2018-03-28 05:49:59,3.28
2018-03-28 05:50:59,3.45
2018-03-28 05:51:59,3.258332
2018-03-28 05:52:59,3.068333
2018-03-28 05:53:59,2.9733330000000002
2018-03-28 05:54:59,3.0650009999999996
2018-03-28 05:55:59,3.109999
2018-03-28 05:56:59,3.3683330000000002
2018-03-28 05:57:59,3.1516669999999998
2018-03-28 05:58:59,3.051666
2018-03-28 05:59:59,3.3083339999999994
2018-03-28 06:01:01,3.328333
2018-03-28 06:01:01,3.1
2018-03-28 06:02:00,3.305
2018-03-28 06:03:00,3.29
2018-03-28 06:04:00,3.2183330000000003
2018-03-28 06:05:00,3.176666
2018-03-28 06:06:00,3.353333
2018-03-28 06:07:00,3.3233330000000003
2018-03-28 06:08:00,3.393332
2018-03-28 06:09:00,3.053334
2018-03-28 06:10:00,3.268333
2018-03-28 06:11:00,3.239999
2018-03-28 06:12:00,3.223332
2018-03-28 06:13:00,3.119999

test4.csv

timestamp,metric2
2018-03-21 00:00:00,10.665
2018-03-21 00:01:00,10.285
2018-03-21 00:02:00,10.12834

Примечание: test2.csv и test4.csv взяты из ТОЧНО одного и того же набора данных.

Теперь давайте загрузим файлы CSV:

tt1 = pd.read_csv('test1.csv', index_col=0)
tt1.index = pd.to_datetime(tt1.index)
tt2 = pd.read_csv('test2.csv', index_col=0)
tt2.index = pd.to_datetime(tt2.index)
tt4 = pd.read_csv('test4.csv', index_col=0)
tt4.index = pd.to_datetime(tt4.index)

Теперь давайте протестируем их конкатенацию:

Тест с ошибкой

tt3 = pd.concat([tt1, tt4], axis = 1)

Тест с ошибкой

tt3 = pd.concat([tt1, tt2], axis = 1)
ValueError: cannot reindex from a duplicate axis

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Я решил ваш вопрос.

Посмотрите это решение:)

import pandas as pd

tt1 = pd.read_csv('test1.csv', index_col=0)
tt1.index = pd.to_datetime(tt1.index)
tt2 = pd.read_csv('test2.csv', index_col=0)
tt2.index = pd.to_datetime(tt2.index)
tt4 = pd.read_csv('test4.csv', index_col=0)
tt4.index = pd.to_datetime(tt4.index)

tt3 = pd.concat([tt1, tt4], axis=1)
tt4 = tt3.reset_index().merge(tt2.reset_index(), how='outer')
tt4 = tt4.set_index('timestamp')
print(tt4)

Надеюсь, оно будет иметь смысл

0 голосов
/ 23 мая 2018

Не merge, join.join включается в индексы.

tt1.join(tt2, how='outer')
0 голосов
/ 23 мая 2018

У вас есть дубликат индекса в tt2.Это вызывает ошибку.Правильный способ получить вывод:

tt1.reset_index().merge(tt2.reset_index(), how='outer')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...