分享一个Pandas应用实战案例——使用Python实现根据关系进行分组
迎新年,GPT-4 Plus账号大大降价了!
一、前言
近日,有群友提出这样的问题:
群友提示可以使用ChatGPT,并给出代码:
二、实现过程
这里【瑜亮老师】给出了另外一个答案,与此同时,根据需求,构造数据,使用pandas也可以完成需求,代码如下:
import pandas as pd
data = [
['刘备', '关羽'], ['刘备', '张飞'],
['曹操', '夏侯'], ['张飞', '诸葛'],
['夏侯', '荀彧'], ['孙权', '鲁肃']
]
df = pd.DataFrame(data, columns=['发起', '接收'])
# 创建一个空字典用于存储人名与组别的映射关系
groups = {}
# 遍历数据框的每一行
for _, row in df.iterrows():
sender = row['发起']
receiver = row['接收']
# 检查发起者是否已存在于映射关系中
if sender not in groups:
# 如果不存在,则将发起者添加到映射关系中,并分配一个新的组别
group = max(groups.values()) + 1 if groups else 1
groups[sender] = group
# 检查接收者是否已存在于映射关系中
if receiver not in groups:
# 如果不存在,则将接收者添加到映射关系中,并分配与发起者相同的组别
group = groups[sender]
groups[receiver] = group
# 根据人名与组别的映射关系更新数据框的'组别'列
df['组别'] = df['发起'].map(groups)
print(df)
# 同时可以将groups也用字典形式输出
result = {}
for k, v in groups.items():
if v not in result.keys():
result[v] = k
else:
result[v] += "," + k
print(result)
运行之后可以得到如下结果:
同时,根据大佬的提示,在python中这是典型的查找连通图的问题,直接的思路是使用现成的networkx包直接调用求解连通图的算法即可,代码如下:
import networkx as nx
g = nx.Graph()
data = [
['刘备', '关羽'], ['刘备', '张飞'],
['曹操', '夏侯'], ['张飞', '诸葛'],
['夏侯', '荀彧'], ['孙权', '鲁肃']
]
g.add_edges_from(data)
for sub_g in nx.connected_components(g):
g_node = g.subgraph(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'] = False
g = nx.Graph()
data = [
['刘备', '关羽'], ['刘备', '张飞'],
['曹操', '夏侯'], ['张飞', '诸葛'],
['夏侯', '荀彧'], ['孙权', '鲁肃']
]
g.add_edges_from(data)
nx.draw_networkx(g)
代码运行后的结果如下:
三、总结
这篇文章主要盘点了一个Pandas
数据分析的问题,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题
GPT-4 Office 全家桶发布,我们的工作方式将永远改变!
评论