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

多级列索引DataFrame使用.loc进行列切片查询的技术疑问

多级列索引DataFrame使用.loc进行列切片查询的技术疑问

我现在有一个带多级列索引的DataFrame,生成代码如下:

import pandas as pd
import numpy as np

arrays = [
    ["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"],
    ["one", "two", "one", "two", "one", "two", "one", "two"],
]
tuples = list(zip(*arrays))

index = pd.MultiIndex.from_tuples(tuples, names=["first", "second"])

s = pd.DataFrame(np.random.randn(8), index=index).T

生成的DataFrame结构大概是这样:

barbarbazbazfoofooquxqux
onetwoonetwoonetwoonetwo
0-0.1441350.625481-2.139184-1.066893-0.123791-1.0581650.495627-0.654353

我看到Pandas文档里提到可以用这种方式做索引:

df.loc[:, (slice("bar", "two"), ...)]

于是我尝试写s.loc[:, (slice("bar", ...,但操作后没得到预期结果,实在搞不懂怎么正确用.loc对多级列索引做切片查询。

正确的多级列索引切片方法

其实处理多级列索引时,要明确每一级索引的筛选规则,给你几个实用的正确操作示例:

  • 切片第一级从"bar"到"foo"的所有列:
    第一级用slice指定范围,第二级用...或slice(None)表示取所有值:

    # 简洁写法
    s.loc[:, slice("bar", "foo")]
    # 更明确的多级指定写法
    s.loc[:, (slice("bar", "foo"), slice(None))]
    
  • 精准获取第一级为"bar"、第二级为"one"的列:
    直接用元组对应每一级的索引值:

    s.loc[:, ("bar", "one")]
    
  • 切片第一级从"bar"到"baz"、第二级为"two"的列:
    组合两级的筛选条件:

    s.loc[:, (slice("bar", "baz"), "two")]
    

关于文档示例的补充说明

你看到的文档写法(slice("bar", "two"), ...)其实有场景前提——如果"two"是第一级索引的取值才适用,但在你的DataFrame里"two"是第二级索引,直接照搬就会出错。正确的逻辑是:元组里的每个元素对应一级索引的筛选规则,slice(start, end)用来指定范围,...或slice(None)表示该级取所有索引值。

备注:内容来源于stack exchange,提问作者plotmaster473

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 13:08:06