如何将API获取的棒球赛事统计数据转为Pandas DataFrame?
解决Pandas转换API数据到DataFrame的长度不匹配问题
问题背景
从API获取三组键值对数据:summary["awayBattingTotals"]、summary["homeBattingTotals"]、summary["teamInfo"],具体数据如下:
# awayBattingTotals {'namefield': 'Totals', 'ab': '33', 'r': '2', 'h': '7', 'hr': '1', 'rbi': '2', 'bb': '0', 'k': '8', 'lob': '13', 'avg': '', 'ops': '', 'obp': '', 'slg': '', 'name': 'Totals', 'position': '', 'note': '', 'substitution': False, 'battingOrder': '', 'personId': 0} # homeBattingTotals {'namefield': 'Totals', 'ab': '34', 'r': '4', 'h': '9', 'hr': '2', 'rbi': '4', 'bb': '1', 'k': '7', 'lob': '13', 'avg': '', 'ops': '', 'obp': '', 'slg': '', 'name': 'Totals', 'position': '', 'note': '', 'substitution': False, 'battingOrder': '', 'personId': 0} # teamInfo {'away': {'id': 145, 'abbreviation': 'CWS', 'teamName': 'White Sox', 'shortName': 'Chi White Sox'}, 'home': {'id': 118, 'abbreviation': 'KC', 'teamName': 'Royals', 'shortName': 'Kansas City'}}
执行pd.DataFrame.from_dict(summary)时触发错误:ValueError: All arrays must be of the same length
错误原因
summary包含三种不同结构的数据:前两个是单条击球统计字典,第三个是嵌套的主客场队信息字典。直接用from_dict转换时,Pandas会尝试将每个键作为列,但不同字典的键对应的值长度不统一,导致报错。
解决方法
步骤1:整合击球统计数据并关联球队信息
将客场、主场的击球统计数据添加球队标识后,合并为统一列表再转换为DataFrame:
import pandas as pd # 提取三组数据 away_batting = summary["awayBattingTotals"] home_batting = summary["homeBattingTotals"] team_info = summary["teamInfo"] # 给客场统计添加球队属性 away_batting.update({ "team_type": "away", "team_abbr": team_info["away"]["abbreviation"], "team_name": team_info["away"]["teamName"] }) # 给主场统计添加球队属性 home_batting.update({ "team_type": "home", "team_abbr": team_info["home"]["abbreviation"], "team_name": team_info["home"]["teamName"] }) # 转换为DataFrame batting_stats_df = pd.DataFrame([away_batting, home_batting])
步骤2:单独生成球队信息DataFrame(可选)
如果需要单独存储球队信息,可以将teamInfo转换为以球队类型为索引的DataFrame:
team_info_df = pd.DataFrame.from_dict(team_info, orient="index")
效果说明
处理后的数据结构统一,Pandas可以正确识别每一行的统计记录,同时关联了对应的球队信息,避免了长度不匹配的问题。
内容的提问来源于stack exchange,提问作者sajeeni
相关产品推荐
相关产品推荐

