如何在Pandas中为B列匹配行的索引分配A列行值(A列含重复)
解决Pandas中A列值替换为B列匹配行索引的高效方法
你完全没必要用逐行循环来实现,Pandas的矢量化操作能帮你高效搞定这个需求!核心思路是先构建B列值到对应行索引的映射关系,再批量替换A列的值,全程都是底层优化过的操作,比循环快太多。
具体实现步骤
1. 先准备示例数据
把你给出的示例转换成Pandas DataFrame:
import pandas as pd data = { 'A': ['x', 'y', 'z', 'k', 'x'], 'B': ['k', 'z', 'y', 'x', 'nAn'] } df = pd.DataFrame(data)
初始的DataFrame长这样:
A B 0 x k 1 y z 2 z y 3 k x 4 x nAn
2. 构建B列值到索引的映射字典
直接利用Pandas的to_dict()方法,就能快速生成{B列值: 对应行索引}的字典:
b_to_idx = df['B'].to_dict()
这个字典的内容是:{'k':0, 'z':1, 'y':2, 'x':3, 'nAn':4}
3. 批量替换A列的值
用map()方法把A列的每个值替换成字典中对应的索引,这一步是矢量化操作,效率拉满:
df['A'] = df['A'].map(b_to_idx)
4. 最终结果
执行完后,DataFrame就变成了你想要的样子:
A B 0 3 k 1 2 z 2 1 y 3 0 x 4 3 nAn
额外说明
如果你的B列存在重复值,上面的方法会取最后一次出现的索引(因为字典键唯一,后面的会覆盖前面的)。要是需要取第一次出现的索引,可以用下面的代码构建映射字典:
b_to_idx_first = df['B'].reset_index().drop_duplicates(subset='B', keep='first').set_index('B')['index'].to_dict()
内容的提问来源于stack exchange,提问作者Baily
相关产品推荐
相关产品推荐

