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

如何基于球员DataFrame构建共同进球关联矩阵?

球员共同进球关联矩阵构建方案

问题背景

现有两个DataFrame:

  1. 存储足球球员名单的player DataFrame:
import pandas as pd
player= ["David Gonzalez","Agustin Martinez","Jibrail Al-Hindi","Edward Cahill","Simon Becker","Paolo Imperiali","Amir Bahari","Guilherme Souza"]
player = pd.DataFrame(player, columns=["player_name"])
  1. 记录各比赛进球球员的football DataFrame:
idscorer
1David Gonzalez, Edward Cahill
2Agustin Martinez,Brian McNamara
3Agustin Martinez, Jibrail Al-Hindi
4Edward Cahill,Guilherme Souza
5Paolo Imperiali, Yannick Wagner
6Simon Becker,Amir Bahari
7Paolo Imperiali,Yannick Wagner
8Amir Bahari,Guilherme Souza,David Gonzalez
9Edward Cahill,Amir Bahari
10Simon Becker
11Amir Bahari
12Paolo Imperiali,Simon Becker
13Edward Cahill,Guilherme Souza
14Edward Cahill,Amir Bahari
15Simon Becker
16Simon Becker

需求:构建一个以player中所有球员为行和列的矩阵,若两名球员有共同进球的比赛则对应位置为1,否则为0。尝试过np.zeros((player,scorer))但方向有误,需要矩阵的行和列显示球员名称,值为1或0。

解决方案

步骤1:预处理进球数据,过滤有效球员

先拆分每场比赛的进球球员,同时过滤掉不在目标球员名单里的外部球员:

import pandas as pd
import numpy as np
from itertools import combinations_with_replacement, chain

# 定义目标球员集合,用于快速校验
player_list = ["David Gonzalez","Agustin Martinez","Jibrail Al-Hindi","Edward Cahill","Simon Becker","Paolo Imperiali","Amir Bahari","Guilherme Souza"]
player_set = set(player_list)

# 处理football的scorer列:拆分字符串、去除空格、过滤有效球员
football['scorer_clean'] = football['scorer'].apply(
    lambda x: [name.strip() for name in x.split(',') if name.strip() in player_set]
)

步骤2:生成球员共同进球的关联对

遍历每场比赛的有效球员,生成所有两两组合(包含球员自身,若不需要可调整):

# 生成单场比赛内的球员两两组合,单球员比赛生成自身对自身的组合
match_pairs = football['scorer_clean'].apply(
    lambda x: list(combinations_with_replacement(x, 2)) if len(x) >=1 else []
)

# 把所有比赛的组合展开为一维列表
all_pairs = list(chain.from_iterable(match_pairs))

步骤3:构建关联矩阵

创建全0矩阵并设置行/列名为球员名称,再给有共同进球的位置赋值为1:

# 初始化全0矩阵,行和列都用目标球员名单命名
adj_matrix = pd.DataFrame(
    np.zeros((len(player_list), len(player_list)), dtype=int),
    index=player_list,
    columns=player_list
)

# 遍历所有关联对,给对应位置设为1(矩阵对称,双向赋值)
for p1, p2 in all_pairs:
    adj_matrix.loc[p1, p2] = 1
    adj_matrix.loc[p2, p1] = 1

可选调整

  • 若不需要对角线(球员自身与自身的关联)为1,将combinations_with_replacement替换为combinations,同时无需处理对角线赋值。
  • 若不需要矩阵对称(仅保留行球员与列球员的单向关联),可去掉adj_matrix.loc[p2, p1] = 1这一行。

内容的提问来源于stack exchange,提问作者user20494840

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:45:37