我有2个不同的数据帧,它们的同一列称为date
。现在,我要绘制这些数据帧,其中X
轴上的值是这两个数据帧共有的date
列,而Y
轴上的值是value
。此外,我想在将两个数据帧都连接到第三帧之后执行此操作。目前,这是我的工作:
df1 = pd.DataFrame({'value': [1,2,3,4,5], 'date': [20,40,60,80,100]})
df2 = pd.DataFrame({'value': [11,21,31,41,51], 'date': [20,40,60,80,100]})
df3 = pd.concat([df1, df2], keys=['df1','df2'], axis=1)
df3.plot()
plt.show()
但是结果图不是我想要的。从图例中可以看到它生成了4个图。
我怎么能有两个具有公共X
轴的图,而差异却反映在Y
轴上?请注意,我要在连接数据帧df1
和df2
并通过在plot
上调用df3
之后执行此操作
答案 0 :(得分:2)
在连接之前,可以将“日期”列用作索引。
df1 = pd.DataFrame({'value': [1,2,3,4,5], 'date': [20,40,60,80,100]})
df2 = pd.DataFrame({'value': [11,21,31,41,51], 'date': [20,40,60,80,100]})
df3 = pd.concat([df1.set_index("date"), df2.set_index("date")], keys=['df1','df2'], axis=1)
df3.plot()
这将创建一个仅包含两个“值”列和日期作为索引的数据框。 绘制索引时,将其用作x值,并为每列绘制一条线。
您也可以忽略忽略列索引,然后设置新的列名
df3 = pd.concat([df1.set_index("date"), df2.set_index("date")], axis=1, ignore_index =True)
df3.columns=['df1','df2']
或者在串联后删除两列共有的索引级别。
df3 = pd.concat([df1.set_index("date"), df2.set_index("date")], keys=['df1','df2'], axis=1)
df3.columns = df3.columns.droplevel(level=1)
答案 1 :(得分:1)
尝试:
df3=pd.merge(df1,df2,on='date')
df3.plot.line(x="date")
plt.show()
首先,由于日期似乎相同,因此可以在日期列上进行合并
df3=pd.merge(df1,df2,on='date')
value_x date value_y
0 1 20 11
1 2 40 21
2 3 60 31
3 4 80 41
4 5 100 51
使用matplotlib的另一种方法: 绘制日期与value_x和日期与value_y
plt.plot(df3["date"],df3["value_x"],label="df1")
plt.plot(df3["date"],df3["value_y"],label="df2")
plt.legend()
plt.show()