Конкатенация pd.Series приводит к pandas.core.indexes.base.InvalidIndexError - PullRequest
1 голос
/ 19 сентября 2019

Я не понимаю, почему мой код не работает.

Если я выполняю приведенный ниже код, я получаю следующую ошибку:

pandas.core.indexes.base.InvalidIndexError: Переиндексация действительна только для объектов индекса с уникальным значением.

Созданные серии имеют все временные метки, где некоторые записи совпадают.Я не понимаю, в чем отличие примера от руководства для панд , потому что индексы dfs также имеют идентичные индексы.

ds = pd.Series([dat[1] for dat in dic_data[name]], index=[dat[0] for dat in dic_data[name]], name=name) # create the series
ds_list.append(ds)


df = pd.concat(ds_list,axis=1,sort=False) # i copyed this line from the example, from the pandas manual

результирующий кадр данных должен быть создан, как тот, что в примере pics

1 Ответ

0 голосов
/ 23 сентября 2019

В примере с pandas вы можете иметь pandas.Series, который имеет те же или похожие значения индекса, что и другое, которое вы намереваетесь объединить.Однако каждое значение индекса pandas.Series должно быть уникальным.

т.е. len(ds.index) - len(ds.index.unique()) должно равняться 0

Ваш индекс в ds имеет несколько одинаковых значений,Если вы хотите объединить на основе index, неясно, как объединить эти индексы с другим pandas.Series, поэтому вы получите ошибку.

Например, ваш код будет работать, если каждый dsимеет уникальный индекс.

ds_list = []
dates =  pd.date_range(start='1/1/2019', periods=7); values = np.arange(7)
dic_data = {'Col1' : [(dates[i], values[i]) for i in range(7)], 'Col2' : [(dates[i], values[i]*2) for i in range(7)]}
for name in dic_data.keys():
    ds = pd.Series([dat[1] for dat in dic_data[name]], index=[dat[0] for dat in dic_data[name]], name=name)
    ds_list.append(ds)

df = pd.concat(ds_list,axis=1,sort=False)
In [43]: df
Out[43]:
            Col1  Col2
2019-01-01     0     0
2019-01-02     1     2
2019-01-03     2     4
2019-01-04     3     6
2019-01-05     4     8
2019-01-06     5    10
2019-01-07     6    12

Однако, если у вашего ds есть дублированные значения индекса, он не будет:

dic_data = {'Col1' : [(dates[i % 7], values[i % 7]) for i in range(12)], 'Col2' : [(dates[i], values[i]*2) for i in range(7)]}
for name in dic_data.keys():
    ds = pd.Series([dat[1] for dat in dic_data[name]], index=[dat[0] for dat in dic_data[name]], name=name)
    ds_list.append(ds)

InvalidIndexError: Reindexing only valid with uniquely valued Index objects

Как исправление, я бы агрегировал метки временинапример, сделав groupby, или вы хотите объединить эти дубликаты:

dic_data = {'Col1' : [(dates[i % 7], values[i % 7]) for i in range(12)], 'Col2' : [(dates[i], values[i]*2) for i in range(7)]}
for name in dic_data.keys():
    ds = pd.Series([dat[1] for dat in dic_data[name]], index=[dat[0] for dat in dic_data[name]], name=name)
    ds = ds.groupby(level=0).sum()
    ds_list.append(ds)

Или вы можете просто удалить дубликаты, например, ds.drop_duplicates() ...

...