如何用Pandas转换游戏匹配数据为NetworkX/IGraph可用网络数据
解决方案
一、生成边列表DataFrame(player_1, player_2, coplays_number)
这是NetworkX/IGraph最常用的输入格式,操作步骤如下:
- 导入依赖库
import pandas as pd import itertools
- 生成每场比赛的玩家两两组合
按match_id分组,对每组玩家生成所有无序2元组合,再展开为新的DataFrame:
# 假设原始数据存储在名为df的DataFrame中 edges = df.groupby('match_id')['player_id'].apply( lambda x: list(itertools.combinations(sorted(x), 2)) # 排序保证(player1,player2)顺序统一,避免重复统计 ).explode() # 将组合拆分为player_1和player_2列 edges = pd.DataFrame(edges.tolist(), columns=['player_1', 'player_2'])
- 统计每对玩家的共玩次数
coplays = edges.groupby(['player_1', 'player_2']).size().reset_index(name='coplays_number')
最终得到的coplays就是符合需求的边列表,可直接用于网络分析。
二、生成邻接矩阵
若需要以玩家为行列、共玩次数为值的邻接矩阵,可基于上述边列表转换:
# 先构建基础邻接矩阵 adj_matrix = coplays.pivot(index='player_1', columns='player_2', values='coplays_number').fillna(0) # 补全对称位置(共玩关系是双向的) adj_matrix = adj_matrix.add(adj_matrix.T, fill_value=0)
若要确保所有玩家都出现在矩阵的行列中,可重新索引:
all_players = df['player_id'].unique() adj_matrix = adj_matrix.reindex(index=all_players, columns=all_players, fill_value=0)
三、直接适配NetworkX/IGraph
无需额外预处理,用生成的边列表即可直接构建带权重的网络:
NetworkX
import networkx as nx # 从边列表构建带权重的无向图 G = nx.from_pandas_edgelist( coplays, source='player_1', target='player_2', edge_attr='coplays_number' ) # 示例:查看边权重 for u, v, data in G.edges(data=True): print(f"{u} - {v}: 共玩{data['coplays_number']}次")
IGraph
from igraph import Graph # 从边列表构建带权重的无向图 g = Graph.DataFrame(coplays, directed=False, edge_attrs=['coplays_number']) # 示例:查看所有边的权重 print(g.es['coplays_number'])
内容的提问来源于stack exchange,提问作者alyx
相关产品推荐
相关产品推荐

