如何获取第一列各值在第二列对应的行索引?
批量映射重复值到唯一值的行索引
问题场景
你有两组数据:
- 第一组是包含大量重复值的长序列:
0 'A' 1 'B' 2 'B' 3 'C' 4 'A' 5 'A'
- 第二组是第一组的所有唯一值,按顺序排列:
0 'A' 1 'B' 2 'C'
需要为第一组的每个值匹配其在第二组中的行索引,最终得到:
0 'A' 0 1 'B' 1 2 'B' 1 3 'C' 2 4 'A' 0 5 'A' 0
且实际数据量极大,无法手动处理。
高效解决方案
核心思路是先构建唯一值到对应索引的映射字典,利用字典O(1)的查找效率实现批量匹配,完全适配大数据量场景。
方案1:使用Pandas(适合结构化数据)
import pandas as pd # 模拟输入数据 df_long = pd.DataFrame({'value': ['A', 'B', 'B', 'C', 'A', 'A']}) df_unique = pd.DataFrame({'value': ['A', 'B', 'C']}) # 构建映射字典:唯一值 -> 行索引 value_to_idx = df_unique['value'].reset_index().set_index('value')['index'].to_dict() # 批量映射生成结果列 df_long['matched_index'] = df_long['value'].map(value_to_idx) # 输出结果 print(df_long)
执行后输出:
value matched_index 0 A 0 1 B 1 2 B 1 3 C 2 4 A 0 5 A 0
方案2:纯Python实现(适合列表/序列数据)
# 模拟输入数据 long_sequence = ['A', 'B', 'B', 'C', 'A', 'A'] unique_sequence = ['A', 'B', 'C'] # 构建映射字典 value_to_idx = {val: idx for idx, val in enumerate(unique_sequence)} # 生成带匹配索引的结果 result = [(idx, val, value_to_idx[val]) for idx, val in enumerate(long_sequence)] # 按格式输出 for item in result: print(f"{item[0]} '{item[1]}' {item[2]}")
执行后输出完全符合预期:
0 'A' 0 1 'B' 1 2 'B' 1 3 'C' 2 4 'A' 0 5 'A' 0
性能说明
两种方案的时间复杂度均为O(n + m)(n为长序列长度,m为唯一值序列长度),字典查找的常数时间特性确保即使处理千万级数据也不会出现性能瓶颈,远优于逐行遍历匹配的O(n*m)复杂度。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

