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

在R中如何匹配日期与击球手ID,将球员统计信息合并至比赛日志?

解决方案

1. 统一球员统计数据格式

你现在的球员统计数据按日期分散存储(如May_1、May_2),第一步要把这些零散数据合并成一个包含日期、球员ID、各项统计指标的统一DataFrame,这是高效匹配的基础。

用Python pandas实现的示例代码:

import pandas as pd
import glob

# 匹配所有日期统计文件(根据你的实际文件名规则调整)
stat_files = glob.glob("May_*.csv")
combined_stats = pd.DataFrame()

for file in stat_files:
    # 从文件名提取日期(示例:May_1 → 2024-05-01,需根据实际情况调整年份和日期格式)
    date_part = file.split("_")[1].replace(".csv", "")
    game_date = pd.to_datetime(f"2024-05-{date_part}")
    
    # 读取单日期统计数据并添加日期列
    daily_stats = pd.read_csv(file)
    daily_stats["Date"] = game_date
    combined_stats = pd.concat([combined_stats, daily_stats], ignore_index=True)

# 确保球员ID列类型一致(避免匹配时因类型不兼容出错)
combined_stats["BatterID"] = combined_stats["BatterID"].astype(str)

2. 批量爬取减少重复请求

为了避免重复爬取同一球员同一日期的数据,先从Game_Logs中提取所有唯一的**(日期, 球员ID)**组合:

# 提取Game_Logs中所有需要的击球手ID和日期组合
batter1_pairs = game_logs[["Date", "Batter1_ID"]].rename(columns={"Batter1_ID": "BatterID"})
batter2_pairs = game_logs[["Date", "Batter2_ID"]].rename(columns={"Batter2_ID": "BatterID"})
all_required_pairs = pd.concat([batter1_pairs, batter2_pairs]).drop_duplicates()

# 基于这些唯一组合批量爬取数据,替换上面的分散文件读取步骤
# 这里替换成你的爬取逻辑:遍历all_required_pairs的每一行,爬取对应日期+球员的统计数据
# 爬取后整理成和combined_stats一致的格式即可

这种方式能大幅减少网络请求次数,避免重复爬取相同内容。

3. 用两次左连接匹配两个击球手的数据

不用嵌套循环,直接用pandas的merge(左连接)分别匹配两个击球手的统计数据,自动对应到日志行:

# 先统一Game_Logs的列类型,确保和统计数据匹配
game_logs["Date"] = pd.to_datetime(game_logs["Date"])
game_logs["Batter1_ID"] = game_logs["Batter1_ID"].astype(str)
game_logs["Batter2_ID"] = game_logs["Batter2_ID"].astype(str)

# 第一次连接:匹配Batter1的统计数据,添加后缀区分
logs_with_batter1 = pd.merge(
    game_logs,
    combined_stats,
    left_on=["Date", "Batter1_ID"],
    right_on=["Date", "BatterID"],
    how="left",
    suffixes=("", "_batter1")
)

# 第二次连接:匹配Batter2的统计数据
final_logs = pd.merge(
    logs_with_batter1,
    combined_stats,
    left_on=["Date", "Batter2_ID"],
    right_on=["Date", "BatterID"],
    how="left",
    suffixes=("_batter1", "_batter2")
)

# 清理多余的重复列
final_logs = final_logs.drop(columns=["BatterID_batter1", "BatterID_batter2"])

最终的final_logs会包含原日志的所有列,加上Hits_batter1、HomeRuns_batter1、Hits_batter2等分别对应两个击球手的统计数据。

为什么不用嵌套循环?

嵌套循环在数据量大时效率极低,而pandas的merge是基于向量化操作,处理速度快得多;同时批量爬取+统一数据格式的方式,从根源上减少了重复爬取的次数,避免不必要的网络开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:20:26