Python Pandas:使用isin时保留重复匹配的对应索引
高效实现匹配重复元素的索引映射方法
问题描述
给定包含唯一Col1值的DataFrame,以及一个包含重复元素的Python列表,需要根据列表中与Col1匹配的值生成对应索引列表,并保留列表中的重复次数。使用df.loc[df['Col1'].isin(list),:].index只能得到唯一索引,循环处理效率过低,需寻找高效实现方式。
解决方案
核心思路是先构建Col1值到DataFrame索引的映射关系,再利用该映射对目标列表进行批量转换,自然保留重复次数。以下是两种高效实现方式:
方法1:使用字典映射
import pandas as pd # 构建示例DataFrame data = { 'Col1': [1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074], 'Col2': [2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104] } df = pd.DataFrame(data, index=[f'Index{i}' for i in range(1, 21)]) # 目标列表 target_list = [1055, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1074] # 构建Col1到索引的字典映射 col1_index_map = df.reset_index().set_index('Col1')['index'].to_dict() # 批量转换得到结果 output = [col1_index_map[val] for val in target_list]
方法2:使用Pandas Series映射(更高效)
# 构建Col1到索引的Series映射 col1_index_series = df.reset_index().set_index('Col1')['index'] # 利用Series的loc方法批量匹配,自动保留重复次数 output = col1_index_series.loc[target_list].tolist()
说明
- 两种方法均基于**
Col1值唯一**的前提(若Col1存在重复值,需根据需求调整映射逻辑,比如取第一个匹配索引或所有匹配索引)。 - 方法2使用Pandas的向量化操作,相比列表推导式在处理超大列表时性能更优。
- 最终输出
output将完全匹配目标列表的元素顺序和重复次数,得到期望的索引列表。
内容的提问来源于stack exchange,提问作者StatistikDude
相关产品推荐
相关产品推荐

