Python 使用Matplotlib打印多级标题数据帧

Python 使用Matplotlib打印多级标题数据帧,python,pandas,dataframe,matplotlib,Python,Pandas,Dataframe,Matplotlib,我已经阅读了Pandas的excel文件,如下所示,如何使用Matplotlib正确绘制它 顺便说一句,当我read_clipboard()这种数据格式时,它会生成parserror:saw5第3行中预期有4个字段。错误可能是由于使用多字符分隔符时忽略了引号。 手动将excel文件修改为以下格式后: date A_ratio A_price B_ratio B_price 0 2007 12.00 8.90 3.04 6.35 1 2008

我已经阅读了Pandas的excel文件,如下所示,如何使用Matplotlib正确绘制它

顺便说一句,当我
read_clipboard()
这种数据格式时,它会生成
parserror:saw5第3行中预期有4个字段。错误可能是由于使用多字符分隔符时忽略了引号。

手动将excel文件修改为以下格式后:

    date  A_ratio  A_price  B_ratio  B_price
0   2007    12.00     8.90     3.04     6.35
1   2008    13.00     8.78     4.04     6.25
2   2009    14.00     9.08     5.04     6.50
3   2010    14.71     9.21     1.38     6.60
4   2011    15.71     9.22     2.38     6.66
5   2012    16.71     9.27     3.38     6.66
6   2013    16.09     9.56     1.38     6.85
7   2014    17.09     9.71     2.38     6.94
8   2015    18.09     9.31     3.38     6.65
9   2016    19.09     9.88     4.38     6.95
10  2017    20.09     9.76     5.38     6.88
我用以下代码绘制了它,它可以工作,但我不想更改它,因为我的原始数据非常大:

df = df.set_index('date')
plt.figure(figsize=(10, 10))
cols = ['A_ratio', 'A_price', 'B_ratio', 'B_price']
df[cols].plot(kind='bar')
plt.xticks(rotation=45)
plt.xlabel("")
输出:


请帮帮我,谢谢。

我想你可以使用
地图
加入
进行展平
多索引

df = df.set_index('date')
df.columns = df.columns.map('_'.join)

plt.figure(figsize=(10, 10))
cols = ['A_ratio', 'A_price', 'B_ratio', 'B_price']
df[cols].plot(kind='bar')
plt.xticks(rotation=45)
plt.xlabel("")
或者您可以通过
tuple
s选择多索引值:

df = df.set_index('date')

plt.figure(figsize=(10, 10))
cols = [('A','ratio'), ('A','price'), ('B','ratio'),('B','price')]
df[cols].plot(kind='bar')
plt.xticks(rotation=45)
plt.xlabel("")

抱歉,它会生成
ValueError:无法处理非唯一的多索引
对于
df=df.set_index('date')
,我认为问题来自多个标题。pandas尚未正确读取excel文件。@ahbon-您是否尝试
pd.read\u excel(文件头=[0,1],索引列=[0])
?这似乎是正确读取文件,但它会生成
键错误:“
df的“
列中没有任何['date'”。设置索引('date')
。@ahbon如果省略
df=df.set\u index('date'))
?因为它应该创建
date
到indexIf check
df=pd.read\u excel(文件,头=[0,1],索引列=[0])
它将
date
列转换为索引,所以使用
df=df.sort\u index()
代替
df.sort\u值(by='date')