You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas转换游戏匹配数据为NetworkX/IGraph可用网络数据

解决方案

一、生成边列表DataFrame(player_1, player_2, coplays_number)

这是NetworkX/IGraph最常用的输入格式,操作步骤如下:

  1. 导入依赖库
import pandas as pd
import itertools
  1. 生成每场比赛的玩家两两组合
    按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'])
  1. 统计每对玩家的共玩次数
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:16:03