如何在含列表的列上使用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
相关产品推荐
相关产品推荐

