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
相关产品推荐
相关产品推荐

