如何绘制多层索引DataFrame 解决seaborn绘图一维数据报错
问题根因
- 报错是因为传入
sns.lineplot()的y参数是二维DataFrame,不符合接口要求的一维数据结构(一维数组、Series、列表均可)。 - 你实际使用的是**列方向多层索引(MultiIndex)**的DataFrame,这种结构下如果只用单层列名取值,pandas会返回保留剩余列层级的二维DataFrame,而非一维Series,这就是触发维度错误的直接原因。你给出的单层索引样例DF运行该代码不会报错,问题仅出在多层索引的真实数据上。
问题复现
用你提供的真实数据结构构造测试对象,可以直接验证维度问题:
import pandas as pd import datetime import seaborn as sns import matplotlib.pyplot as plt # 基于你给出的字典构造DataFrame raw_data = {('USGG10YR Index', 'PX_LAST'): {datetime.date(2018, 12, 31): 2.6842, datetime.date(2019, 1, 1): 2.6842, datetime.date(2019, 1, 2): 2.6204, datetime.date(2019, 1, 3): 2.5535, datetime.date(2019, 1, 4): 2.6677}, ('GTFRF10YR Corp', 'PX_LAST'): {datetime.date(2018, 12, 31): 0.705, datetime.date(2019, 1, 1): 0.705, datetime.date(2019, 1, 2): 0.648, datetime.date(2019, 1, 3): 0.651, datetime.date(2019, 1, 4): 0.697}, ('GTDEM10YR Corp', 'PX_LAST'): {datetime.date(2018, 12, 31): 0.239, datetime.date(2019, 1, 1): 0.239, datetime.date(2019, 1, 2): 0.164, datetime.date(2019, 1, 3): 0.151, datetime.date(2019, 1, 4): 0.206}, ('GTITLII10Y Govt', 'PX_LAST'): {datetime.date(2018, 12, 31): 1.811, datetime.date(2019, 1, 1): 1.811, datetime.date(2019, 1, 2): 1.782, datetime.date(2019, 1, 3): 1.947, datetime.date(2019, 1, 4): 1.974}} DF = pd.DataFrame(raw_data) # 查看列索引类型 print(DF.columns) # 输出为MultiIndex结构,共两层:第一层为标的名称,第二层为字段名 # 仅用第一层列名取值,检查返回对象类型和维度 target_col = DF["USGG10YR Index"] print(type(target_col)) # 输出 <class 'pandas.core.frame.DataFrame'> print(target_col.ndim) # 输出 2,为二维结构 # 这时候执行绘图代码就会复现你的报错 fig, Myax = plt.subplots() sns.lineplot(x=DF.index, y=target_col, ax=Myax) # 抛出 ValueError: Data must be 1-dimensional
修复方案
两种常用修复方式,按需选择即可:
- 取值时传入完整的多层列名元组,直接获取一维Series
# 列名传入(一级索引值, 二级索引值)的元组,返回一维Series sns.lineplot( x=DF.index, y=DF[("USGG10YR Index", "PX_LAST")], ax=Myax ) - 提前将多层列索引降为单级,后续按普通DataFrame方式操作
# 拼接两层列名生成单级列名 DF.columns = [f"{level1}_{level2}" for level1, level2 in DF.columns] # 之后直接用单级列名取值即可 sns.lineplot( x=DF.index, y=DF["USGG10YR Index_PX_LAST"], ax=Myax )
内容的提问来源于stack exchange,提问作者TourEiffel
相关产品推荐
相关产品推荐

