多级列索引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结构大概是这样:
| bar | bar | baz | baz | foo | foo | qux | qux | |
|---|---|---|---|---|---|---|---|---|
| one | two | one | two | one | two | one | two | |
| 0 | -0.144135 | 0.625481 | -2.139184 | -1.066893 | -0.123791 | -1.058165 | 0.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
相关产品推荐
相关产品推荐

