我正在尝试取消堆叠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()
非常感谢任何帮助。
答案 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()
如果您希望所有绘图都从原点开始,您可以使用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()