在pandas中的groupBy之后绘制多个列

时间:2018-04-16 16:36:51

标签: pandas pandas-groupby

给出表格的df

df = pd.DataFrame(
    {
    "date": [datetime.datetime(2018, 1, x) for x in range(1, 8)],    
    "label": ["A", "A", "B", "B", "C", "A", "C"],
    "value1": [1, 22, 3, 4, 5, 6, 7],
    "value2": [10, 4, 30, 5, 6, 8, 9]
    }
)
df.set_index('date', inplace=True)

我希望有一个包含所有6行的图:每个组的value1value2的值。我浏览了其他答案,但我无法找到如何正确地做到这一点。我最好的是

fig, ax = plt.subplots()
for label, df in grouped:
    df.plot(ax=ax, label="Value for {}".format(label))
plt.legend()

产生这个结果:

enter image description here

这里有两个问题(概率相同):

  • 我似乎无法控制标签文字
  • 标签它现在没用,因为它没有提供信息

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

也许只是使用轴来绘制而不是DataFrame并明确提到你想要绘制的内容?

grouped = df.groupby('label')
fig, ax = plt.subplots()
for label, df2 in grouped:
    ax.plot(df2['value1'], label=label+' value1')
    ax.plot(df2['value2'], label=label+' value2')
plt.xticks(rotation=30)
plt.xlabel(df.index.name)
plt.legend()

enter image description here

或者如果你不想多次写出来,只需指定你想要提前绘制的列,并使用另一个循环。

plot_vals = ['value1', 'value2']

fig, ax = plt.subplots()
for label, df2 in grouped:
    for col in df2.columns[df2.columns.isin(plot_vals)]:
        ax.plot(df2[col], label=label+ ' ' + col)
plt.xticks(rotation=30)
plt.xlabel(df.index.name)
plt.legend()