Pandas为两列所有唯一值生成整数ID并回写原表的实现方法
Pandas 双列唯一值映射ID实现方案
你当前提取两列全量唯一值的思路是可行的,只需要补充映射回写的逻辑即可,以下提供两种可直接运行的实现方式:
方案1:基于你现有代码补全
你已经完成了唯一值提取和ID编号,只需要将标签和ID的对应关系转为字典,用map方法匹配到原表对应列即可:
import pandas as pd df = pd.DataFrame({'orig':['INOA','AFXR','GUTR','AREB'], 'dest':['AFXR','INOA','INOA','GAPR'], 'count':[100,50,1,5]}) # 你已实现的唯一值提取逻辑 labels = pd.DataFrame(pd.unique(df[['orig', 'dest']].values.flatten())) labels.index += 1 # 构建 值到ID 的映射字典 label_map = {value: idx for idx, value in labels[0].items()} # 生成两个ID列 df['orig_id'] = df['orig'].map(label_map) df['dest_id'] = df['dest'].map(label_map) # 调整列顺序和预期输出对齐 df = df[['orig_id', 'dest_id', 'orig', 'dest', 'count']]
运行后输出结果和你给出的示例完全一致:
orig_id dest_id orig dest count 0 1 2 INOA AFXR 100 1 2 1 AFXR INOA 50 2 3 1 GUTR INOA 1 3 4 5 AREB GAPR 5
方案2:更简洁的分类编码实现
不需要单独生成labels中间表,直接利用pandas的分类类型能力完成编码,逻辑更紧凑:
import pandas as pd df = pd.DataFrame({'orig':['INOA','AFXR','GUTR','AREB'], 'dest':['AFXR','INOA','INOA','GAPR'], 'count':[100,50,1,5]}) # 按首次出现顺序提取两列所有唯一值 all_cats = pd.unique(df[['orig', 'dest']].values.flatten()) # 转为指定顺序的分类类型,编码从0开始,+1后ID从1计数 cat_type = pd.CategoricalDtype(categories=all_cats) df['orig_id'] = df['orig'].astype(cat_type).cat.codes + 1 df['dest_id'] = df['dest'].astype(cat_type).cat.codes + 1 # 调整列顺序 df = df[['orig_id', 'dest_id', 'orig', 'dest', 'count']]
两种方案生成的ID映射规则完全一致,均按值在两列扁平化后首次出现的顺序从1开始编号,匹配你要求的映射关系:INOA=1、AFXR=2、GUTR=3、AREB=4、GAPR=5。
内容的提问来源于stack exchange,提问作者binary01
相关产品推荐
相关产品推荐

