如何在Pandas DataFrame中为反向出现的两列值分配相同标识值
解决Pandas为反向配对行分配唯一标识的问题
正确实现代码
import pandas as pd import numpy as np # 示例数据 g = pd.DataFrame({ 'Column_a': [6, 7, 11, 10, 12, 15], 'Column_b': [7, 6, 10, 11, 15, 12] }) # 对每行的两列值进行排序,生成一致的配对键 sorted_pairs = np.sort(g[['Column_a', 'Column_b']], axis=1) # 将排序后的配对转为元组,作为分组依据生成唯一ID g['New'] = pd.factorize(list(zip(sorted_pairs[:, 0], sorted_pairs[:, 1])))[0] + 1 print(g)
输出结果
Column_a Column_b New 0 6 7 1 1 7 6 1 2 11 10 2 3 10 11 2 4 12 15 3 5 15 12 3
原代码问题分析
你之前的代码 g['New']=pd.DataFrame(np.sort(g[['Column_a','Column_b']])).duplicated(keep=False).astype(int) 之所以全部返回1,是因为 duplicated(keep=False) 仅标记是否属于重复组,所有重复行都会被标记为True(转为int就是1),但无法区分不同的重复组。
核心思路说明
- 统一配对顺序:用
np.sort(..., axis=1)对每行的两列值排序,让(6,7)和(7,6)都变成(6,7),确保同一配对的行有一致的标识依据。 - 生成唯一组ID:用
pd.factorize()为每个唯一的排序配对分配一个整数ID,+1是为了让ID从1开始(默认从0开始)。
内容的提问来源于stack exchange,提问作者Manik Kumar
相关产品推荐
相关产品推荐

