如何解决ValueError:索引包含重复的条目,无法重构

时间:2016-08-20 10:44:58

标签: python pandas matplotlib seaborn

我正在尝试取消堆叠MultiIndex系列,以便我可以相互映射系列。

import pandas as pd
import numpy as np

dicts = {}

index = np.linspace(1, 50)
index[2] = 2.0
index2 = index.copy()
index2[3] = 3.0

for n in range(5):
    if n == 1:
        dicts['test' + str(n)] = pd.Series(np.linspace(0, 20) ** (n / 5),
                                           index=index2)
    else:
        dicts['test' + str(n)] = pd.Series(np.linspace(0, 20) ** (n / 5),
                                           index=index)

s = pd.concat(dicts, names=('test', 'displacement'))
s.unstack(level='test').plot()

最后一行中的unstack()得到ValueError: Index contains duplicate entries, cannot reshape。其他StackOverflow问题似乎都与数据透视表有关,但我并没有尝试聚合数据;简单地绘制它。

我希望每个测试有1行1行(MultiIndex的0级)。每一行都是系列值与位移(MultiIndex的第1级)。

我现在的黑客是:

for test_name, test in s.groupby(level='test'):
    test.index = test.index.droplevel()
    test.plot()

plt.show()

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您可以在DF.set_index中设置append=True,以便在unstack操作期间再次避免默认的写入条目。它只添加之前未存在于未堆栈列中的条目。

import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style("whitegrid")

df = pd.concat(dicts, names=('test', 'displacement')).reset_index()
labels = np.unique(df['test'].values).tolist()
df.set_index(['test', 'displacement'], append=True, inplace=True)
df.unstack(level='test').plot(figsize=(10,10), use_index=False,               
                              legend=False, title="Grouped Plot")
plt.legend(loc='upper left', fontsize=12, frameon=True, labels=labels)
plt.show()

Image1

如果您希望所有绘图都从原点开始,您可以使用array_split根据唯一标签的总长度(即5 [dataframe对象拆分为相同的大小> Test0 → Test4 ]如下:

df = pd.concat(dicts, names=('test', 'displacement')).reset_index()
labels = np.unique(df['test'].values).tolist()
df.set_index(['test', 'displacement'], append=True, inplace=True)

fig, ax = plt.subplots(figsize=(10,10))
for test_sample in range(len(labels)):
    np.array_split(df.unstack('test'), len(labels))[test_sample].plot(grid=True, 
                   use_index=False, ax=ax, legend=False, cmap=plt.cm.get_cmap('jet'))
plt.legend(loc='upper left', fontsize=12, frameon=True, labels=labels)
plt.xlim(0,50)
plt.title("Grouped Plot")
plt.show()

Image2