本文目录导读:

你想统计“任意球直接得分”的次数,这个需求在足球数据里很常见,不过要先明确一点:没有一个通用的“任意球直接得分”官方统计口径,不同数据源(Opta、WhoScored、Transfermarkt、FIFA官方)对“直接任意球破门”的判定可能不同(比如是否排除折射、是否算作定位球进球的一种)。
下面给你一个可运行的 Python 脚本模板,它假设你有一份结构化数据(CSV/Excel),包含比赛事件记录,然后统计“任意球直接得分”的次数。
如果你有事件级数据(推荐)
假设你的 CSV 长这样(events.csv):
match_id,minute,team,player,event_type,set_piece_type,shot_outcome,is_direct 1,23,A队,张三,shot,free_kick,goal,1 1,45,B队,李四,shot,free_kick,off_target,0 2,67,A队,王五,shot,free_kick,goal,0
event_type == "shot"表示射门事件set_piece_type == "free_kick"表示任意球shot_outcome == "goal"表示进球is_direct == 1表示直接射门得分(非配合后射门)
脚本:
import pandas as pd
# 读取数据
df = pd.read_csv("events.csv")
# 筛选:任意球 + 射门 + 进球 + 直接得分
direct_fk_goals = df[
(df["event_type"] == "shot") &
(df["set_piece_type"] == "free_kick") &
(df["shot_outcome"] == "goal") &
(df["is_direct"] == 1)
]
# 总次数
total = len(direct_fk_goals)
print(f"任意球直接得分总次数: {total}")
# 按球员统计
by_player = direct_fk_goals.groupby("player").size().sort_values(ascending=False)
print("\n按球员统计:")
print(by_player)
# 按球队统计
by_team = direct_fk_goals.groupby("team").size().sort_values(ascending=False)
print("\n按球队统计:")
print(by_team)
# 导出明细
direct_fk_goals.to_csv("direct_fk_goals.csv", index=False)
如果你只有“进球方式”文本字段
假设数据里有一列 goal_type,值为中文描述,如 "直接任意球"、"点球"、"头球" 等:
import pandas as pd
df = pd.read_csv("goals.csv")
# 模糊匹配“直接任意球”
mask = df["goal_type"].str.contains("直接任意球", na=False)
direct_fk_goals = df[mask]
print(f"任意球直接得分总次数: {len(direct_fk_goals)}")
print(direct_fk_goals.groupby("player").size().sort_values(ascending=False))
从公开数据源抓取(示例:FBref)
FBref 有 Pass Types 和 Shooting 表,FK 列表示任意球射门,SoT 表示射正,但不直接区分“直接任意球进球”,你需要结合 Shooting 表的 FK 列(任意球射门数)和比赛事件中的进球类型来判断,FBref 的 match report 里有 Free Kick 进球标注,可以用 soccerdata 库抓取:
import soccerdata as sd fbref = sd.FBref(leagues="ENG-Premier League", seasons="2023-2024") # 抓取比赛事件(需要具体 match_id) # 然后筛选 event_type 含 "Free Kick" 且为 Goal 的记录
注意:FBref 对直接任意球进球的标注不一定 100% 准确,且抓取需遵守其使用条款。
关键提醒
- “直接得分”的判定:必须排除“任意球战术配合后射门得分”,前者是直接射门入网,如果你的数据只有“任意球进球”而没有“是否直接”,统计结果会偏高。
- 折射球:有些数据源把折射入网也算直接任意球,有些不算,需统一口径。
- 数据源选择:Opta/StatsBomb 的事件数据最细,但需付费;FBref/Transfermarkt 免费但粒度粗。
如果你能告诉我你手头的数据格式(CSV 字段、来自哪个网站、是事件级还是汇总级),我可以帮你把脚本改成直接能跑的样子。