You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 08:33:12