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
相关产品推荐
相关产品推荐

