如何用Python的Pandas/Numpy评估含点球的足球比赛结果并判定胜者
解决方案
1. 正则提取比分信息
用正则表达式一次性提取常规比分和点球比分的数字,避免拆分符号时的冲突。正则模式可直接捕获点球数和常规比分:
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'match_id': [1, 2, 3, 4], 'score': ['2-1', '1-1(4)', '(5)1-1', '(5)1-1(4)'] }) # 正则提取:分组1=主队点球数,分组2=主队常规比分,分组3=客队常规比分,分组4=客队点球数 pattern = r'^(?:\((\d+)\))?(\d+)-(\d+)(?:\((\d+)\))?$' score_data = df['score'].str.extract(pattern).astype(float) score_data.columns = ['pen_home', 'reg_home', 'reg_away', 'pen_away'] # 合并回原DataFrame df = pd.concat([df, score_data], axis=1)
2. 判定比赛胜者
写一个简单的逻辑函数,先看常规比分,打平再看点球结果:
def determine_winner(row): # 常规比分分胜负 if row['reg_home'] > row['reg_away']: return 'home' elif row['reg_home'] < row['reg_away']: return 'away' # 常规打平且有点球数据 elif pd.notna(row['pen_home']) and pd.notna(row['pen_away']): return 'home' if row['pen_home'] > row['pen_away'] else 'away' # 常规打平但无点球(如友谊赛平局) else: return 'draw' # 应用函数生成胜者列 df['winner'] = df.apply(determine_winner, axis=1)
运行后示例输出:
| match_id | score | pen_home | reg_home | reg_away | pen_away | winner |
|---|---|---|---|---|---|---|
| 1 | 2-1 | NaN | 2.0 | 1.0 | NaN | home |
| 2 | 1-1(4) | NaN | 1.0 | 1.0 | 4.0 | away |
| 3 | (5)1-1 | 5.0 | 1.0 | 1.0 | NaN | home |
| 4 | (5)1-1(4) | 5.0 | 1.0 | 1.0 | 4.0 | home |
关键细节说明
- 正则里的
(?:...)是非捕获分组,只匹配格式不提取内容,确保我们只拿到需要的数字 - 用
astype(float)转换时,空值自动转为NaN,方便后续判断是否存在点球 - 逻辑函数可根据赛事规则调整(比如部分赛事常规打平直接算平局,无需点球判定)
内容的提问来源于stack exchange,提问作者Manuel Amundaray
相关产品推荐
相关产品推荐

