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

将标签型索引(loc)转为位置型索引(iloc)的更优实现方法问询

更优雅高效的标签转位置索引方法

当然有比暴力法更好的实现方式!pandas本身就提供了专门的工具来处理这类标签到位置索引的映射需求,不仅代码更简洁,性能也更出色,尤其适合大型数据集。

方法1:使用pd.Index.get_indexer()(推荐)

这是pandas官方推荐的方法,专门用于获取一组标签对应的位置索引,底层经过优化,效率很高:

import numpy as np
import pandas as pd

data = pd.DataFrame(
    {
        'x': [11, 12, 13],
        'y': [21, 22, 23]
    },
    index=['a', 'b', 'c']
)

my_lab = ['a', 'c']
my_pos = data.index.get_indexer(my_lab)
# 输出:array([0, 2])

它还支持处理不存在的标签(默认返回-1,可以通过missing参数自定义),灵活性拉满。

方法2:构建标签-位置字典(适合多次查询场景)

如果需要多次根据标签查询位置,先构建一个映射字典会更高效——字典的查询时间复杂度是O(1):

label_pos_map = {label: idx for idx, label in enumerate(data.index)}
my_pos = [label_pos_map[label] for label in my_lab]
# 输出:[0, 2]

这种方式可读性极强,一眼就能明白你在做什么,而且重复查询时性能优势明显。

对比你的暴力法

你原来的代码:

my_pos = (data.index == my_idx).to_numpy().nonzero()[0]

其实等价于np.where(data.index.isin(my_lab))[0],但这两种方式都需要遍历整个索引来匹配,当数据集很大时,效率会远不如上面两种方法。

总结一下,优先用get_indexer(),简洁又高效;如果需要多次查询,就用字典映射的方式,性能和可读性都在线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:34:39