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

如何对Pandas分层列数据绘图及将分层列转为普通单列?

报错原因说明

你遇到的报错由两个问题共同导致:

  1. plot方法的x/y参数只需要传入列名(分层列对应元组格式的列名),但你直接传入了筛选后的完整DataFrame切片,pandas无法判断DataFrame的布尔值,因此抛出该错误。
  2. 代码中"Cerebral Cortex "末尾多了多余空格,和实际的列名不匹配,即使修复第一个问题也会筛选不到对应列。
解决方案1:直接选取分层列绘制散点图

pivot生成的分层列是MultiIndex结构,每个列的名称是(reg_name, reg_side)格式的元组,直接传入对应元组作为x/y参数即可:

import pandas as pd
import matplotlib.pyplot as plt

# 你原有生成分层表的代码
data = {'RID': [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5], 'Str_dx': ['CN', 'CN', 'CN', 'CN', 'MCI', 'MCI', 'MCI', 'MCI', 'MCI;Dementia', 'MCI;Dementia', 'MCI;Dementia', 'MCI;Dementia', 'CN', 'CN', 'CN', 'CN', 'MCI', 'MCI', 'MCI', 'MCI'], 'reg_name': ['Hippocampus', 'Cerebral Cortex', 'Hippocampus', 'Cerebral Cortex', 'Hippocampus', 'Cerebral Cortex', 'Hippocampus', 'Cerebral Cortex', 'Hippocampus', 'Cerebral Cortex', 'Hippocampus', 'Cerebral Cortex', 'Hippocampus', 'Cerebral Cortex', 'Hippocampus', 'Cerebral Cortex', 'Hippocampus', 'Cerebral Cortex', 'Hippocampus', 'Cerebral Cortex'], 'reg_side': ['left', 'left', 'right', 'right', 'left', 'left', 'right', 'right', 'left', 'left', 'right', 'right', 'left', 'left', 'right', 'right', 'left', 'left', 'right', 'right'], 'gm_vol': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]}
df = pd.DataFrame(data)
tab = pd.pivot_table(df, values='gm_vol', index=['RID', 'Str_dx'], columns=['reg_name', 'reg_side'])

# 绘制散点图,直接传入分层列的元组
tab.plot(kind="scatter", 
         x=('Hippocampus', 'left'), 
         y=('Cerebral Cortex', 'left'), 
         alpha=0.6, 
         c='black')
plt.show()
解决方案2:拆解分层列为普通列

根据你的使用场景,可以选择两种拉平方式:

方式1:拼接列名为单层级字符串

将两层列名用下划线拼接为单个字符串,保留宽表结构:

tab_flat = tab.copy()
# 拼接两层列名
tab_flat.columns = ['_'.join(col) for col in tab.columns]
# 此时列名变为普通单层级:['Hippocampus_left', 'Hippocampus_right', 'Cerebral Cortex_left', 'Cerebral Cortex_right']

# 后续选列直接用字符串即可
tab_flat.plot(kind="scatter", x='Hippocampus_left', y='Cerebral Cortex_left', alpha=0.6, c='black')

方式2:完全拉平为长表格式

如果不需要保留宽表结构,直接将所有维度转为普通列,后续筛选、分组操作更灵活:

tab_long = tab.reset_index().melt(id_vars=['RID', 'Str_dx'], value_name='gm_vol')
# 输出后reg_name、reg_side都变为独立的普通列,你可以按需筛选数据

内容的提问来源于stack exchange,提问作者Al_Mt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 22:15:10