将标签型索引(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
相关产品推荐
相关产品推荐

