networkx快速解决连通图问题
需求1:找社区
有一份数据部分如下,比如:刘备和关羽有关系,说明他们是一个团伙,刘备和张飞也有关系,那么刘备、关羽、张飞归为一个社区,以此类推。
在python中这是典型的查找连通图的问题,直接的思路是使用现成的包直接调用求解连通图的算法即可。
import networkx as nxg = nx.Graph()
data = [['刘备', '关羽'],['刘备', '张飞'],['张飞', '诸葛亮'],['曹操', '司马懿'],['司马懿', '张辽'],['曹操', '曹丕']
]
g.add_edges_from(data)for sub_g in nx.connected_components(g):sub_g = g.subgraph(sub_g)g_node = sub_g.nodes()print(g_node)
结果:
['刘备', '关羽', '张飞', '诸葛亮']
['曹操', '司马懿', '张辽', '曹丕']
使用networkx我们还可以将图绘制出来:
from matplotlib import pyplot as plt
import networkx as nx
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsenx.draw_networkx(g)
plt.show()
需求2:统一用户识别
上述需求在使用现成的图算法的情况下还是非常简单的,下面再看看另一个问题:
每一行代表广告平台接受到的用户访问数据,但是广告商获取到唯一标识不总是一样,有时可以获取到mac地址,有时是手机号,有时设备码,这些唯一标识字段虽有缺失,但都属于同一个用户,现在需要把属于同一用户的数据找出来,并将标签进行合并。
对于这个需求,我的思路是按照每个主键列分别分组,将唯一的行号索引作为关联关系的边,从而得到归属同一用户对应的行号。
首先创建数据:
import pandas as pddf = pd.DataFrame([['a1', None, 'c1', None, None, 'tag1'],[None, None, 'c1', 'd1', None, 'tag2'],[None, 'b1', None, 'd1', None, 'tag3'],[None, 'b1', 'c1', 'd1', 'e1', 'tag4'],['a2', 'b2', None, None, None, 'tag1'],[None, 'b4', 'c4', None, 'e4', 'tag1'],['a2', None, None, 'd2', None, 'tag2'],[None, None, 'c2', 'd2', None, 'tag3'],[None, 'b3', None, None, 'e3', 'tag1'],[None, None, 'c3', None, 'e3', 'tag2'],
], columns=list("abcde")+["tags"])
构建图的顶点和边:
import networkx as nx
g = nx.Graph()
keylist = list("abcde")
g.add_nodes_from(df.index)
for c in keylist:for ids in df.index.groupby(df[c]).values():n = len(ids)if n == 1:continuefor i in range(n-1):for j in range(i+1, n):g.add_edge(ids[i], ids[j])
绘制看看效果:
nx.draw_networkx(g)
可以看到,有联系的行已经顺利的关联到一起。
下面我们根据连通顶点的索引值对原始的datafream进行分组:
for sub_g in nx.connected_components(g):sub_g = g.subgraph(sub_g)g_node = list(sub_g.nodes())df_split = df.iloc[g_node]display(df_split)
结果:
然后将每个切片合并,下面以最后一个切片为例测试一下:
row = df_split[keylist].bfill().iloc[0]
row["tags"] = df_split.tags.str.cat(sep=",")
row
a None
b b3
c c3
d None
e e3
tags tag1,tag2
Name: 8, dtype: object
下面整理一下完整代码:
import networkx as nx
import pandas as pddf = pd.DataFrame([['a1', None, 'c1', None, None, 'tag1'],[None, None, 'c1', 'd1', None, 'tag2'],[None, 'b1', None, 'd1', None, 'tag3'],[None, 'b1', 'c1', 'd1', 'e1', 'tag4'],['a2', 'b2', None, None, None, 'tag1'],[None, 'b4', 'c4', None, 'e4', 'tag1'],['a2', None, None, 'd2', None, 'tag2'],[None, None, 'c2', 'd2', None, 'tag3'],[None, 'b3', None, None, 'e3', 'tag1'],[None, None, 'c3', None, 'e3', 'tag2'],
], columns=list("abcde")+["tags"])g = nx.Graph()
keylist = list("abcde")
g.add_nodes_from(df.index)
for c in keylist:for ids in df.index.groupby(df[c]).values():n = len(ids)if n == 1:continuefor i in range(n-1):for j in range(i+1, n):g.add_edge(ids[i], ids[j])data = []
for sub_g in nx.connected_components(g):sub_g = g.subgraph(sub_g)g_node = sub_g.nodes()ids = list(g_node)df_split = df.iloc[ids]row = df_split[keylist].bfill().iloc[0]row["tags"] = df_split.tags.str.cat(sep=",")data.append(row)
data = pd.DataFrame(data)
data
结果:
可以看到已经顺利的得到我们想要的结果。
networkx快速解决连通图问题相关推荐
- php pdo 中文乱码,php pdo oracle中文乱码的快速解决方法
在/etc/profile.d/简历oracle.sh 内容如下在NLS_LANG设置编码ORACLE_HOME=/usr/lib/oracle/12.1/client64 C_INCLUDE_PAT ...
- 计算机数据恢复教程视频,视频删了怎么恢复?小技巧帮你快速解决
视频删了怎么恢复?小技巧帮你快速解决 2019年07月03日 17:20作者:黄页编辑:黄页 分享 视频删了怎么恢复?如何能够将电脑上误删除的一些重要视频文件给恢复呢?相信很多人都想要知道这个答案,毕 ...
- python不能调用matplotlib_快速解决PyCharm无法引用matplotlib的问题
序 笔者今天用PyCharm安装了一些数据分析的时候比较有用的模块,系统是ubuntu,说实话,ubuntu(linux)在这方面还真是很方便,几条语句就把这几个模块下载安装编译过了,比于window ...
- php 使用css乱码,分享CSS字符编码引起乱码快速解决的方法
下面小编就为大家带来一篇分享CSS字符编码引起乱码快速解决的方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 乱码引起的CSS失效原理: 由于一个中文是两个字符组成, ...
- mysql5.7 首次登陆_mysql5.7.20第一次登录失败的快速解决方法
一,将介绍如何 (1)mysql5.7是有默认密码的 查找默认密码 grep 'temporary password' /var/log/mysqld.log (2)第一次登录 mysql -uroo ...
- python运行卡死_快速解决jupyter启动卡死的问题
问题描述 系统:Win10:之前安装过Cpython,现在依次使用pip install ipython与pip install jupyter安装了 Ipython 6.5.0与 jupyter 1 ...
- php word组件使用方法,快速解决PHP调用Word组件DCOM权限的问题讲解
下面小编就为大家分享一篇快速解决PHP调用Word组件DCOM权限的问题,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 1. 首先必须要在电脑上安装 Office 2. window ...
- 快速解决正则----模糊匹配、字符类、量词
主体概要 正则表达式是什么 是匹配模式.要么匹配字符.要么匹配位置 内容 掌握字符类和量词就能解决大部分常见正则问题 关键内容:字符组.量词.贪婪.惰性.模糊.横向.纵向.分支.位置 重要的基础 ...
- Ubuntu Linux 下文件名乱码(无效的编码)的快速解决办法
Ubuntu Linux 下文件名乱码(无效的编码)的快速解决办法 文件是在WIndows 下创建的,Windows 的文件名中文编码默认为GBK,而Linux中默认文件名编码为UTF8,由于编码 不 ...
最新文章
- 突发 | Yann LeCun卸任!Facebook变天,做AI不能落地是不成了
- flash特效原理:螺旋效果 (3)
- python基础练习(二)
- 曾今的代码系列——获取当天最大流水号存储过程
- mysql 分组 字符串_MySQL查询以字符串字段中的数字字符对行进行分组?
- linux记录iptables日志,iptables日志管理
- selenium自动化测试_使用Selenium自动化测试处理多个浏览器选项卡
- Winform datagridview相关操作
- python爬虫爬微信红包_python 微信红包
- mac安装多php环境变量配置,Mac如何安装多个php版本
- 实时仪表板的Postgres通知
- SpringBoot项目中获取yml文件的属性时实体属性类出现Spring Boot Configuration Annotation Processor not found in classpath
- configparser ,shelve ,hashlib,random模块
- [eclipse error]'Android Dependencies' which does not allow modifications to source attachments on it
- cdr添加节点快捷键_CDR快捷键大全(精编排).doc
- 未转变者3.x局域网服务器,未转变者局域网怎么创建服务器
- 【愚公系列】2021年12月 攻防世界-简单题-MOBILE-008(Ph0en1x-100)
- Annoying Present
- 磨金石教育摄影技能干货分享|古风人像拍摄要注意哪些问题
- 学生表/教师表/课程表/成绩表常见SQL查询
热门文章
- 自动驾驶研发测试当前面临的挑战与方案
- 实现协程的方式及协程的意义 【笔记】
- Simulink的Variant Model和Variant Subsystem用法
- 报错error Irregular whitespace not allowed no-irregular-whitespace的解决办法
- java 抢单 缓存服务器_第二节:抢单流程优化1(小白写法→lock写法→服务器缓存+队列→redis缓存+队列)...
- java header接口_【分享】接口测试-header头部详解
- slideup slidedown
- python 的列表是从0还是1开始的_Python 列表
- 学会Python后都能做什么?网友们的回答简直不要太厉害
- 知识计算决策智能年度观察|知识计算价值逐渐凸显,决策智能重塑企业竞争优势