如何将DataFrame中IP与user_id的关联组合并为唯一行?
解决方法:基于图连通分量合并关联IP与用户ID
你的需求本质是要找出IP地址与用户ID之间的所有连通关联组,把每个组内的所有IP和用户ID分别汇总到一行。可以借助图论中的连通分量概念来实现,下面是具体步骤:
步骤1:准备环境与数据
先导入所需库,构造示例DataFrame:
import pandas as pd import networkx as nx # 示例数据 data = { 'ip_address': ['127.0.0.1', '192.168.1.1', '127.0.0.1', '10.10.0.1', '8.8.8.8', '8.8.8.8', '8.8.8.8', '10.0.0.1'], 'user_id': ['111', '111', '444', '555', '666', '888', '999', '777'] } df = pd.DataFrame(data)
步骤2:构建关联图
把IP地址和用户ID看作图的节点,每条数据记录就是IP与用户ID之间的一条连接边:
G = nx.Graph() # 遍历每条记录,添加IP与用户ID的连接边 for _, row in df.iterrows(): # 统一转成字符串,避免类型不一致导致的节点识别问题 G.add_edge(row['ip_address'], str(row['user_id']))
步骤3:提取连通分量
找出图中所有的连通分量,每个分量就是一组有直接/间接关联的IP和用户ID:
connected_groups = list(nx.connected_components(G))
步骤4:汇总每个连通分量的IP与用户ID
对每个连通组,分离出IP和用户ID,去重后拼接成字符串:
result_list = [] for group in connected_groups: # 区分IP(含.)和用户ID(纯数字字符串) ips = sorted({node for node in group if '.' in node}) users = sorted({node for node in group if '.' not in node}) result_list.append({ 'ip_address': ', '.join(ips), 'user_id': ', '.join(users) }) # 转换为最终DataFrame final_df = pd.DataFrame(result_list)
最终结果
运行后得到的final_df就是你期望的格式:
| ip_address | user_id |
|---|---|
| 127.0.0.1, 192.168.1.1 | 111, 444, 555 |
| 8.8.8.8 | 666, 888, 999 |
| 10.0.0.1 | 777 |
补充说明
- 如果你的用户ID不是纯数字,可以调整区分IP和用户的判断逻辑(比如用户ID有特定前缀)。
- 若无法安装networkx,也可以用迭代合并的方式实现连通分量,但代码复杂度会高很多,networkx是最简洁高效的方案。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

