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

如何在含列表的列上使用pandas .loc匹配获取对应p_val

解决方法

问题根源

报错TypeError: unhashable type: 'list'是因为combo列存的是列表,而isin()要求传入的元素是可哈希类型(比如元组、字符串),列表不可哈希所以没法用。ValueError则是直接用列表和Series比较时,长度不匹配导致的。

方案一:将combo列转为元组(推荐)

先把DataFrame里的combo列从列表转成元组,这样就能正常用匹配逻辑:

# 预处理:把combo列的列表转成元组
df_sigs['combo'] = df_sigs['combo'].apply(tuple)

# 循环获取p_val
for feature in features:
    for comb in combinations:
        # 把传入的comb也转成元组,和DataFrame里的类型统一
        comb_tuple = tuple(comb)
        # 匹配feature_name和combo,提取对应的p_val
        pval = df_sigs.loc[(df_sigs['feature_name'] == feature) & (df_sigs['combo'] == comb_tuple), 'p_val'].values[0]
        # 这里直接用pval执行绘图逻辑即可

方案二:不修改原DataFrame,直接用元素匹配

如果不想改动原DataFrame,可以用apply()遍历判断每个combo是否和目标列表相等:

for feature in features:
    for comb in combinations:
        # 生成匹配掩码:同时满足feature名称一致、combo列表相等
        mask = (df_sigs['feature_name'] == feature) & (df_sigs['combo'].apply(lambda x: x == comb))
        # 提取p_val,注意先确认有匹配结果再取值
        if mask.sum() > 0:
            pval = df_sigs.loc[mask, 'p_val'].values[0]
            # 后续绘图逻辑

额外提示

如果存在匹配不到对应行的情况,直接取values[0]会触发索引越界错误,建议加个存在性判断(比如方案二里的mask.sum() > 0),避免报错中断程序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:30:47