如何参照带唯一ID的Dataframe1为新Dataframe按指定列分配或生成唯一标识
多列匹配分配唯一ID的实现方案
匹配规则说明
仅以col2、col3、col4三列的精确组合作为匹配依据,不关联其他列的值;已在Dataframe1中存在的组合直接复用原有unique_id,未收录的新组合自动生成与现有ID不重复的新值。
代码实现步骤
- 构建已有ID映射表
把Dataframe1中三列的组合与对应唯一ID的关系转为字典结构,实现O(1)时间复杂度的快速查找,避免逐行比对的性能损耗。import pandas as pd # 提取三元组组合作为字典键,对应unique_id作为值 id_map = {} for _, row in df1.iterrows(): key = (row["col2"], row["col3"], row["col4"]) id_map[key] = row["unique_id"] - 确定新ID的起始阈值
取Dataframe1中已有的最大唯一ID作为新ID的起点,保证新生成的ID和历史ID无重复。current_max_id = df1["unique_id"].max() - 为Dataframe2匹配并生成ID列
逐行遍历Dataframe2的三列组合:已在映射表中存在的直接取对应ID,不存在的则生成新ID、同步更新映射表,避免Dataframe2内部重复组合分配到不同ID的问题。assigned_ids = [] for _, row in df2.iterrows(): match_key = (row["col2"], row["col3"], row["col4"]) if match_key in id_map: assigned_ids.append(id_map[match_key]) else: current_max_id += 1 id_map[match_key] = current_max_id assigned_ids.append(current_max_id) # 把生成的ID列追加到Dataframe2 df2["unique_id"] = assigned_ids
效果校验
按照示例数据运行后,Dataframe2的输出逻辑和你给出的期望结果完全一致:已存在的三元组(如bcd/qwe/rty、zxc/qwe/rty、abc/bcv/zxc)会分别复用12、6、8的历史ID;未收录的kph/hir/mat组合会自动在历史最大ID的基础上递增生成全局唯一的新值(示例中写的35仅为演示新ID的分配逻辑,实际数值由历史ID的最大值决定)。
内容的提问来源于stack exchange,提问作者KPH
相关产品推荐
相关产品推荐

