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

CSV文件4个ID字段关联合并:构建无重复关联ID宽表

解决关联ID宽表构建的方案

嘿,这个需求我熟!本质上是要找出所有ID的连通分量——把每个ID看作一个节点,同一行里的所有非空ID之间都算有连接,最终每个连通的节点组就是一组完全关联的ID。接下来用Python的pandas和networkx来实现,上手很快:

1. 先准备依赖

先安装需要的两个库(如果还没装的话):

pip install pandas networkx

2. 具体代码实现

import pandas as pd
import networkx as nx

# 读取你的CSV文件,替换成实际路径
df = pd.read_csv("your_input_file.csv")
# 定义原数据里的ID列名
id_columns = ["ID_1", "ID_2", "ID_3", "ID_4"]

# 预处理:把所有ID转成字符串,空值统一处理成None
df[id_columns] = df[id_columns].astype(str).replace("nan", None)

# 构建关联图:同一行的非空ID之间建立连接
G = nx.Graph()
for _, row in df.iterrows():
    # 提取当前行所有非空的ID
    valid_ids = [id_val for id_val in row[id_columns] if id_val is not None]
    if len(valid_ids) >= 2:
        # 用add_star快速给同一行的所有ID建立两两连接
        nx.add_star(G, valid_ids)
    elif len(valid_ids) == 1:
        # 单独的ID直接作为孤立节点加入图
        G.add_node(valid_ids[0])

# 获取所有连通分量(也就是所有关联ID组)
connected_groups = list(nx.connected_components(G))

# 生成最终的宽表
# 先确定最大的关联组有多少个ID,用来设置输出列数
max_id_num = max(len(group) for group in connected_groups)
# 定义输出列名:ID_1, ID_2, ..., ID_N
output_cols = [f"ID_{i+1}" for i in range(max_id_num)]

# 把每个关联组转换成一行,不足的位置补空
output_rows = []
for group in connected_groups:
    # 把集合转成有序列表(排序可选,根据你的需求调整)
    sorted_ids = sorted(group)
    # 补全到最大长度,空位置用None填充
    sorted_ids += [None] * (max_id_num - len(sorted_ids))
    output_rows.append(sorted_ids)

# 转成DataFrame并去重(连通分量本身是唯一的,这里做双重保障)
result_df = pd.DataFrame(output_rows, columns=output_cols).drop_duplicates()

# 保存结果到新CSV,空值用空字符串显示
result_df.to_csv("关联ID宽表输出.csv", index=False, na_rep="")

3. 关键逻辑说明

  • 连通分量识别:比如如果行1有ID_A和ID_B,行2有ID_B和ID_C,那这三个ID会被分到同一个关联组,最终输出的一行会包含这三个ID(如果是最大组的话)。
  • 空值处理:原数据里的空ID会被直接忽略,不会参与关联计算;结果里的空缺位置会用空字符串填充(可以修改na_rep参数调整显示内容)。
  • 唯一性保证:每个连通分量都是唯一的ID集合,所以最终的宽表不会出现重复的关联组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:35:04