在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
相关产品推荐
相关产品推荐

