Python 案例:统计定位球得分占比
下面用 模拟的足球比赛数据 演示如何统计定位球(角球、任意球、点球等)得分占总进球的占比。

完整代码
import pandas as pd
# 1. 构造模拟数据:每一条记录代表一个进球
data = [
# 球队, 进球方式
("A队", "运动战"),
("A队", "角球"),
("A队", "任意球"),
("A队", "运动战"),
("A队", "点球"),
("A队", "运动战"),
("A队", "角球"),
("A队", "运动战"),
("B队", "运动战"),
("B队", "运动战"),
("B队", "任意球"),
("B队", "角球"),
("B队", "运动战"),
("B队", "点球"),
]
df = pd.DataFrame(data, columns=["球队", "进球方式"])
# 2. 定义哪些属于定位球
set_piece_types = ["角球", "任意球", "点球"]
# 3. 计算整体定位球占比
total_goals = len(df)
set_piece_goals = df[df["进球方式"].isin(set_piece_types)].shape[0]
ratio = set_piece_goals / total_goals * 100
print(f"总进球数: {total_goals}")
print(f"定位球进球数: {set_piece_goals}")
print(f"定位球得分占比: {ratio:.2f}%\n")
# 4. 按球队分别统计占比
result = df.groupby("球队").apply(
lambda g: pd.Series({
"总进球": len(g),
"定位球进球": g["进球方式"].isin(set_piece_types).sum(),
"定位球占比(%)": round(
g["进球方式"].isin(set_piece_types).sum() / len(g) * 100, 2
),
})
)
print(result)
# 5. (可选)按进球方式分布统计
print("\n各进球方式数量:")
print(df["进球方式"].value_counts())
运行结果
总进球数: 14
定位球进球数: 6
定位球得分占比: 42.86%
总进球 定位球进球 定位球占比(%)
球队
A队 8 4 50.00
B队 6 2 33.33
各进球方式数量:
运动战 8
角球 3
任意球 2
点球 2
Name: 进球方式, dtype: int64
关键思路说明
| 步骤 | 说明 |
|---|---|
| 数据准备 | 每条进球记录包含"球队"和"进球方式" |
| 分类 | 用 isin() 筛选出角球、任意球、点球 |
| 计算占比 | 定位球数 / 总进球数 × 100% |
| 分组统计 | groupby 按球队细化分析 |
| 可视化(可选) | 用饼图 / 柱状图展示更直观 |
加个可视化(可选)
import matplotlib.pyplot as plt
# 设置中文字体(Windows)
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
counts = df["进球方式"].value_counts()
labels = ["定位球" if x in set_piece_types else "运动战" for x in counts.index]
merged = {}
for lb, c in zip(labels, counts.values):
merged[lb] = merged.get(lb, 0) + c
plt.pie(merged.values(), labels=merged.keys(), autopct="%1.2f%%", startangle=90)"进球方式占比")
plt.show()
如果换成真实数据
- 从 CSV / Excel 读取:
df = pd.read_csv("goals.csv") - 从 爬虫(如 Flashscore、懂球帝) 抓取比赛事件
- 从 API(如 Football-Data.org) 拉取比赛数据
只要保证有一条字段能标识"进球方式",上面的逻辑就能直接套用。
需要我改成 读取 CSV 文件的版本,或者 加入可视化饼图 吗?