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

合并含MultiIndex与普通索引的DataFrame后,如何访问列与索引?

拼接普通索引与MultiIndex DataFrame后的列/索引访问问题

复现代码与输出

import numpy as np
import pandas as pd

df1 = pd.DataFrame(np.ones((2, 2)), columns=["a", "b"])

df2_cols = pd.MultiIndex.from_tuples([("c", 1), ("d", 2)])
df2 = pd.DataFrame(data=np.ones((2, 2)), columns=df2_cols)

df = pd.concat([df1, df2], axis=1)
print(df)

输出结果:

a    b  (c, 1)  (d, 2)
0  1.0  1.0     1.0     1.0
1  1.0  1.0     1.0     1.0

遇到的访问问题

  • 使用df.loc[:, ("c", 1)]尝试访问列时触发KeyError,错误信息:

KeyError: "None of [Index(['c', 1], dtype='object')] are in the [columns]"

  • 将DataFrame转置后,df.T.loc[("c", 1)]同样报错
  • 但直接使用df[("c", 1)]却能正常访问目标列

核心原因

拼接普通列索引与MultiIndex列时,pandas会将MultiIndex的每个层级元组转换为单个标签,但整个列索引会降级为普通的Index(而非MultiIndex)。此时loc会把传入的元组("c",1)解析为「访问MultiIndex的两个层级」,但当前索引是普通索引,每个标签本身是元组,因此无法匹配,导致报错。而[]操作符会直接将元组作为单个标签匹配,所以可以正常访问。

无需iloc或重构MultiIndex的访问方法

1. 用列表包裹元组,明确单个标签身份

loc对列表中的元素会按普通索引标签匹配,而非解析为MultiIndex层级:

# 访问列(返回DataFrame)
df.loc[:, [("c", 1)]]

# 访问列并转为Series
df.loc[:, [("c", 1)]].squeeze()

# 转置后访问索引行
df_t = df.T
df_t.loc[[("c", 1)]]

2. 使用get方法安全访问

get方法会直接将元组作为单个标签匹配,还能指定默认值避免报错:

# 获取目标列Series
df.get(("c", 1))

# 若标签不存在返回默认值(示例为None)
df.get(("x", 99), default=None)

3. 通过列筛选定位目标标签

利用columns.isin()筛选出目标标签,再传入loc:

df.loc[:, df.columns.isin([("c", 1)])]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:40:54