如何移除pandas DataFrame中唯一值不足10的含列表列?
解决Pandas DataFrame含列表列时的列筛选问题
嘿,这个问题我碰到过好几次了,核心就是得先把那些不可哈希的列表转换成pandas能处理的类型,同时还要搞定列表顺序不同但元素相同的情况,毕竟你说[1,2]和[2,1]得算同一个值对吧?
咱们一步一步来:
第一步:写个转换函数,把列表变成可哈希且排序的元组
因为pandas计算唯一值的时候依赖哈希,而列表是不可哈希的,所以我们得把每个单元格里的列表转成排序后的元组——排序是为了让元素相同但顺序不同的列表变成同一个元组,这样它们就会被算作同一个唯一值了。函数长这样:
def normalize_list_cell(cell): # 检查单元格是不是列表,是的话转成排序后的元组,不是就原样返回 if isinstance(cell, list): return tuple(sorted(cell)) return cell
第二步:批量计算每一列的有效唯一值数量
接下来我们对DataFrame的每一列应用这个转换函数,然后计算处理后的唯一值数量。这样不管列里是普通数据还是列表,都能正常统计:
# 遍历每一列,先转换单元格再统计唯一值数量 unique_counts = df.apply(lambda col: col.apply(normalize_list_cell).nunique())
第三步:筛选保留符合条件的列
最后我们只保留那些唯一值数量≥10的列就行,完全不用手动指定列名,1400列也能自动处理:
# 只保留唯一值数量不少于10的列 filtered_df = df.loc[:, unique_counts >= 10]
这样操作下来,既解决了“unhashable type: 'list'”的错误,又把[1,2]和[2,1]算作了同一个值,还自动遍历了所有列完成筛选,完美匹配你的需求~
内容的提问来源于stack exchange,提问作者EnnFour
相关产品推荐
相关产品推荐

