使用pandas read_excel传入sheet_name列表读取多工作表时出现TypeError: unhashable type: 'list'错误求助
解决pandas读取多工作表后筛选列的"unhashable type: 'list'"错误
嘿,这个问题我之前也碰到过!你遇到的TypeError: unhashable type: 'list',根源是对pd.read_excel()传入列表型sheet_name时的返回值类型理解错了。
问题本质
当你给sheet_name传列表(比如["D1","D2"]),pd.read_excel()返回的不是单个DataFrame,而是一个字典:键是工作表的名称(比如"D1"、"D2"),值才是对应工作表的DataFrame对象。你后续直接写df[['Date',...]],相当于在给字典用列表当索引——但字典的键必须是可哈希类型(列表是不可哈希的),自然就报错了。
修复方案
你需要遍历这个字典里的每个工作表DataFrame,分别完成列筛选和重命名,最后可以把所有处理好的表合并成一个整体。
修改后的可运行代码
import pandas as pd def process_leagues(league_list): print(league_list) # 读取多工作表,得到字典:{工作表名: 对应DataFrame} df_dict = pd.read_excel("https://www.football-data.co.uk/mmz4281/2122/all-euro-data-2021-2022.xlsx?raw=true", sheet_name=league_list) processed_dfs = [] # 遍历每个工作表的数据 for sheet_name, df in df_dict.items(): print(f"正在处理工作表: {sheet_name}") print(df) # 筛选需要的列 filtered_df = df[['Date','HomeTeam','AwayTeam','HTHG','HTAG','HTR','FTHG','FTAG','FTR','B365H','B365D','B365A','B365>2.5']] # 重命名列名 filtered_df.columns = ['Date', 'Home', 'Away', 'Goals_H_HT', 'Goals_A_HT', 'Result_HT', 'Goals_H_FT', 'Goals_A_FT', 'Result_FT', 'Odds_H', 'Odds_D', 'Odds_A', 'Odds_Over25_FT'] # 可选:添加一列标记数据来自哪个联赛 filtered_df['League'] = sheet_name processed_dfs.append(filtered_df) print(filtered_df) # 把所有处理好的表合并成一个大DataFrame final_df = pd.concat(processed_dfs, ignore_index=True) return final_df # 调用函数处理指定联赛的工作表 result = process_leagues(["D1","D2"]) print("合并后的最终数据:") print(result)
几个关键细节
- 用
df_dict明确接收返回的字典,避免混淆变量类型 - 遍历字典时用
items()同时拿到工作表名和对应的数据,方便追踪来源 - 用
pd.concat()合并表时,ignore_index=True会重置行索引,避免不同表的索引重复 - 新增的
League列能帮你区分不同工作表的数据,后续分析更清晰
内容的提问来源于stack exchange,提问作者Ricardo Magalhaes
相关产品推荐
相关产品推荐

