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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:27:40