如何基于球员DataFrame构建共同进球关联矩阵?
球员共同进球关联矩阵构建方案
问题背景
现有两个DataFrame:
- 存储足球球员名单的
playerDataFrame:
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"])
- 记录各比赛进球球员的
footballDataFrame:
| id | scorer |
|---|---|
| 1 | David Gonzalez, Edward Cahill |
| 2 | Agustin Martinez,Brian McNamara |
| 3 | Agustin Martinez, Jibrail Al-Hindi |
| 4 | Edward Cahill,Guilherme Souza |
| 5 | Paolo Imperiali, Yannick Wagner |
| 6 | Simon Becker,Amir Bahari |
| 7 | Paolo Imperiali,Yannick Wagner |
| 8 | Amir Bahari,Guilherme Souza,David Gonzalez |
| 9 | Edward Cahill,Amir Bahari |
| 10 | Simon Becker |
| 11 | Amir Bahari |
| 12 | Paolo Imperiali,Simon Becker |
| 13 | Edward Cahill,Guilherme Souza |
| 14 | Edward Cahill,Amir Bahari |
| 15 | Simon Becker |
| 16 | Simon 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
相关产品推荐
相关产品推荐

