Pandas中droplevel报错、索引KeyError及表合并问题求助
Pandas问题解决方案
问题1:AttributeError: 'list' object has no attribute 'columns'
pd.read_html()返回的是DataFrame组成的列表,你直接对整个列表players调用.columns会报错。正确操作是先取出列表内的DataFrame再处理表头:
players = pd.read_html(data.text, match="Standard Stats") # 提取列表中的第一个DataFrame players_df = players[0] # 移除多级表头的其中一级 players_df.columns = players_df.columns.droplevel() # 查看处理后的表格 players_df
问题2:KeyError: 0
修改后的代码已经把列表里的第一个DataFrame赋值给了players,此时players是DataFrame对象,players[0]是尝试取列名为0的列,但你的表格中没有这个列名。直接查看整个DataFrame即可:
players = pd.read_html(StringIO(data.text), match="Standard Stats")[0] # 直接查看完整表格 players # 若要提取某一列,使用实际列名,例如players["Player"]
问题3:KeyError: 'Player'
这个错误说明players或shooting中至少有一个没有名为Player的列。按以下步骤排查解决:
- 先检查两个表的列名:
# 打印players的所有列名 print(players.columns.tolist()) # 打印shooting的所有列名 print(shooting.columns.tolist())
- 如果列名存在大小写、空格差异(比如
player、Player),统一列名:
# 示例:将shooting中的"player"列名改为"Player" shooting.rename(columns={"player": "Player"}, inplace=True)
- 如果两个表的关联列名不同,用
left_on和right_on分别指定:
# 示例:players关联列是"Player",shooting关联列是"Player_Name" team_data = players.merge(shooting[["Distance", "Player_Name"]], left_on="Player", right_on="Player_Name")
内容的提问来源于stack exchange,提问作者user23359383
相关产品推荐
相关产品推荐

