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

Polars-Python:用列值作字典键报错TypeError,求助

问题代码

df_x = (
    df_x
    .filter(pl.col("score") == nested_dict[pl.col("cliente")][pl.col("cluster")])
)

问题描述

想要用DataFrame的列值作为嵌套字典的键,但运行代码时触发错误:TypeError: unhashable type: 'Expr'


错误原因

Polars的pl.col()返回的是表达式对象(Expr),属于延迟计算的抽象对象,并非具体的列值。而Python字典要求键必须是可哈希类型(如字符串、数字),直接用表达式当字典键自然会报错。


解决方案

方案1:用map_elements逐行取值(适合小数据集)

通过map_elements将每行的cliente和cluster具体值传入字典,获取对应的score阈值后与原score列比较:

df_x = df_x.filter(
    pl.col("score") == pl.struct(["cliente", "cluster"]).map_elements(
        lambda row: nested_dict[row["cliente"]][row["cluster"]],
        return_dtype=pl.Int64  # 根据你的score实际类型调整
    )
)

方案2:字典转DataFrame后关联(适合大数据集,性能更优)

把嵌套字典展开为二维结构的DataFrame,通过join关联原表后再过滤匹配行,这种方法避免逐行计算,性能更高效:

# 展开嵌套字典为标准DataFrame
dict_df = pl.DataFrame(
    [(cliente, cluster, score) 
     for cliente, clusters in nested_dict.items() 
     for cluster, score in clusters.items()],
    schema=["cliente", "cluster", "target_score"]
)

# 关联原表并过滤匹配行
df_x = df_x.join(dict_df, on=["cliente", "cluster"]).filter(pl.col("score") == pl.col("target_score"))

内容的提问来源于stack exchange,提问作者nyahm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 22:45:54