You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绘制多层索引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
修复方案

两种常用修复方式,按需选择即可:

  1. 取值时传入完整的多层列名元组,直接获取一维Series
    # 列名传入(一级索引值, 二级索引值)的元组,返回一维Series
    sns.lineplot(
        x=DF.index, 
        y=DF[("USGG10YR Index", "PX_LAST")], 
        ax=Myax
    )
    
  2. 提前将多层列索引降为单级,后续按普通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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:09:24