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

pandas操作MultiIndex多级索引时level=1参数应该添加在什么位置?

解决方案

问题原因

你的DataFrame列是二级MultiIndex结构,直接用Ldata['new']会默认匹配第一级索引(Items层),找不到对应列就会报错,level=1参数是用来指定匹配第二级索引(type层)的,需要放在多级索引列选取的对应位置。


修改后可运行完整代码

import pandas as pd
import numpy as np
import string

# 测试数据生成逻辑不变
index = pd.MultiIndex.from_product(
    ([2020], [1, 2, 3, 4]), names=['year', 'q']
)

columns = pd.MultiIndex.from_product(
    (['Items1', 'Items2', 'Items3'], ['new', 'old']),
    names=['Items', 'type']
)

np.random.seed(123)
data = np.random.choice(list(string.ascii_lowercase), (4,6))

Ldata = pd.DataFrame(data, index=index, columns=columns)

def highlight_cells(x):
    c = 'background-color: white'
    c1 = 'background-color: red'
    c2 = 'background-color: blue'
    c3 = 'background-color: green'
    # 定义多级索引选择器,简化后续列匹配操作
    idx = pd.IndexSlice
    # 此处添加level=1参数,指定匹配列索引的第二级筛选new列
    new_cols = Ldata.xs('new', level=1, axis=1, drop_level=False)
    # 生成匹配布尔掩码
    k1 = new_cols.apply(lambda s: s.str.contains("a", na=False))
    k2 = new_cols.apply(lambda s: s.str.contains("b", na=False))
    k3 = new_cols.apply(lambda s: s.str.contains("c", na=False))
    
    colordata = pd.DataFrame(c, index=x.index, columns=x.columns)
    # 批量给匹配到的new列赋值背景色
    colordata.loc[:, idx[:, 'new']] = np.where(k1, c1, colordata.loc[:, idx[:, 'new']])
    colordata.loc[:, idx[:, 'new']] = np.where(k2, c2, colordata.loc[:, idx[:, 'new']])
    colordata.loc[:, idx[:, 'new']] = np.where(k3, c3, colordata.loc[:, idx[:, 'new']])

    return colordata

end = Ldata.style.apply(highlight_cells,axis=None)
end

修改说明

  • xs方法的level=1参数指定我们匹配多级列索引的第二层,axis=1表示操作对象是列索引,drop_level=False保留原多级索引结构,避免后续赋值时索引层级不匹配
  • 用pd.IndexSlice简化多级索引的切片操作,不需要额外拼接索引即可批量选中所有Items下的new列

内容的提问来源于stack exchange,提问作者project.py

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:06:02