pd.Series的串联会导致pandas.core.indexes.base.InvalidIndexError

时间:2019-09-18 21:28:32

标签: python-3.x pandas dataframe series

我不明白为什么我的代码不起作用。

如果执行下面的代码,则会出现以下错误:

  

pandas.core.indexes.base.InvalidIndexError:仅对具有唯一值的Index对象有效的索引。

创建的系列具有所有时间戳索引,其中某些条目相同。我不明白与manual大熊猫的例子有什么不同, 因为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 :(得分:0)

在熊猫的示例中,您可以拥有一个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() ...