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

如何基于无序的多列组合生成唯一ID(Pandas实现)

基于无序ID组合生成唯一标识的解决方案

场景

假设有一个经流程生成的数据集,包含id1和id2两个ID字段,代表数据来自上游流程的来源。这两列的数据类型可以是整数或字符串。需要基于这两列的ID组合生成唯一ID,但ID的顺序无关紧要。例如:id1 == A且id2 == NaN,与id1 == NaN且id2 == A应视为同一情况,因为实际唯一存在的ID是A。

测试数据

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame({'id1': ['A', np.nan, 'A', 'B'], 'id2': [np.nan, 'B', 'B', 'A']})
>>> df
   id1  id2
0    A  NaN
1  NaN    B
2    A    B
3    B    A

核心问题

如何使用Pandas和Numpy函数,基于id1和id2的无序组合生成单个唯一ID?

已尝试方法

  • 将id1和id2转换为字符串后合并、排序并去重(可行但实现繁琐)
  • 使用pd.factorize:比上述方法更优,但仍需对两列ID进行组合与排序

期望输出

>>> df
   id1  id2  combined_id
0    A  NaN  A
1  NaN    B  B
2    A    B  AB
3    B    A  AB
4  NaN  NaN  NaN

解决方案

方法1:逐行处理(简洁直观)

通过自定义函数过滤空值、去重排序后拼接:

def combine_ids(row):
    # 提取非空ID,去重后排序
    valid_ids = sorted(set(x for x in [row['id1'], row['id2']] if pd.notna(x)))
    return ''.join(valid_ids) if valid_ids else np.nan

df['combined_id'] = df.apply(combine_ids, axis=1)

执行后即可得到符合要求的结果,该方法逻辑清晰,适合中小型数据集。

方法2:向量化操作(高性能)

针对大数据集,推荐使用向量化操作避免逐行循环的性能损耗:

# 填充空值为空字符串并转成字符串类型
id1 = df['id1'].fillna('').astype(str)
id2 = df['id2'].fillna('').astype(str)

# 生成有序组合:确保小值在前,大值在后
combined = np.where(id1 <= id2, id1 + id2, id2 + id1)

# 处理特殊情况:全空则设为NaN,重复ID(如"BB")替换为单个ID
df['combined_id'] = np.where(combined == '', np.nan, combined)
df['combined_id'] = df['combined_id'].str.replace(r'^(.)\1$', r'\1', regex=True)

该方法利用Numpy和Pandas的向量化特性,在数据量较大时性能优势明显。

内容的提问来源于stack exchange,提问作者whatwhatWHAT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:58:11