需求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快速解决连通图问题相关推荐

  1. php pdo 中文乱码,php pdo oracle中文乱码的快速解决方法

    在/etc/profile.d/简历oracle.sh 内容如下在NLS_LANG设置编码ORACLE_HOME=/usr/lib/oracle/12.1/client64 C_INCLUDE_PAT ...

  2. 计算机数据恢复教程视频,视频删了怎么恢复?小技巧帮你快速解决

    视频删了怎么恢复?小技巧帮你快速解决 2019年07月03日 17:20作者:黄页编辑:黄页 分享 视频删了怎么恢复?如何能够将电脑上误删除的一些重要视频文件给恢复呢?相信很多人都想要知道这个答案,毕 ...

  3. python不能调用matplotlib_快速解决PyCharm无法引用matplotlib的问题

    序 笔者今天用PyCharm安装了一些数据分析的时候比较有用的模块,系统是ubuntu,说实话,ubuntu(linux)在这方面还真是很方便,几条语句就把这几个模块下载安装编译过了,比于window ...

  4. php 使用css乱码,分享CSS字符编码引起乱码快速解决的方法

    下面小编就为大家带来一篇分享CSS字符编码引起乱码快速解决的方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 乱码引起的CSS失效原理: 由于一个中文是两个字符组成, ...

  5. mysql5.7 首次登陆_mysql5.7.20第一次登录失败的快速解决方法

    一,将介绍如何 (1)mysql5.7是有默认密码的 查找默认密码 grep 'temporary password' /var/log/mysqld.log (2)第一次登录 mysql -uroo ...

  6. python运行卡死_快速解决jupyter启动卡死的问题

    问题描述 系统:Win10:之前安装过Cpython,现在依次使用pip install ipython与pip install jupyter安装了 Ipython 6.5.0与 jupyter 1 ...

  7. php word组件使用方法,快速解决PHP调用Word组件DCOM权限的问题讲解

    下面小编就为大家分享一篇快速解决PHP调用Word组件DCOM权限的问题,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 1. 首先必须要在电脑上安装 Office 2. window ...

  8. 快速解决正则----模糊匹配、字符类、量词

    主体概要 正则表达式是什么 是匹配模式.要么匹配字符.要么匹配位置 内容 掌握字符类和量词就能解决大部分常见正则问题 关键内容:字符组.量词.贪婪.惰性.模糊.横向.纵向.分支.位置 重要的基础   ...

  9. Ubuntu Linux 下文件名乱码(无效的编码)的快速解决办法

    Ubuntu Linux 下文件名乱码(无效的编码)的快速解决办法 文件是在WIndows 下创建的,Windows 的文件名中文编码默认为GBK,而Linux中默认文件名编码为UTF8,由于编码 不 ...

最新文章

  1. 突发 | Yann LeCun卸任!Facebook变天,做AI不能落地是不成了
  2. flash特效原理:螺旋效果 (3)
  3. python基础练习(二)
  4. 曾今的代码系列——获取当天最大流水号存储过程
  5. mysql 分组 字符串_MySQL查询以字符串字段中的数字字符对行进行分组?
  6. linux记录iptables日志,iptables日志管理
  7. selenium自动化测试_使用Selenium自动化测试处理多个浏览器选项卡
  8. Winform datagridview相关操作
  9. python爬虫爬微信红包_python 微信红包
  10. mac安装多php环境变量配置,Mac如何安装多个php版本
  11. 实时仪表板的Postgres通知
  12. SpringBoot项目中获取yml文件的属性时实体属性类出现Spring Boot Configuration Annotation Processor not found in classpath
  13. configparser ,shelve ,hashlib,random模块
  14. [eclipse error]'Android Dependencies' which does not allow modifications to source attachments on it
  15. cdr添加节点快捷键_CDR快捷键大全(精编排).doc
  16. 未转变者3.x局域网服务器,未转变者局域网怎么创建服务器
  17. 【愚公系列】2021年12月 攻防世界-简单题-MOBILE-008(Ph0en1x-100)
  18. Annoying Present
  19. 磨金石教育摄影技能干货分享|古风人像拍摄要注意哪些问题
  20. 学生表/教师表/课程表/成绩表常见SQL查询

热门文章

  1. 自动驾驶研发测试当前面临的挑战与方案
  2. 实现协程的方式及协程的意义 【笔记】
  3. Simulink的Variant Model和Variant Subsystem用法
  4. 报错error Irregular whitespace not allowed no-irregular-whitespace的解决办法
  5. java 抢单 缓存服务器_第二节:抢单流程优化1(小白写法→lock写法→服务器缓存+队列→redis缓存+队列)...
  6. java header接口_【分享】接口测试-header头部详解
  7. slideup slidedown
  8. python 的列表是从0还是1开始的_Python 列表
  9. 学会Python后都能做什么?网友们的回答简直不要太厉害
  10. 知识计算决策智能年度观察|知识计算价值逐渐凸显,决策智能重塑企业竞争优势