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
相关产品推荐
相关产品推荐

