Python:如何移除DataFrame中counts列内的零值?
解决方案
先模拟一个和你场景匹配的数据集,方便对照:
import pandas as pd from collections import Counter # 模拟你的DataFrame df = pd.DataFrame({ 'samples': ['sample1', 'sample2', 'sample3'], 'results': [[0,1,1,2], [2,3,3,3], [0,0,0,0]] })
假设你原本生成counts列的代码是这样(强制统计0、1、2、3的出现次数,包含0次的情况):
def f(lst): cnt = Counter(lst) return {k: cnt.get(k, 0) for k in [0,1,2,3]} df['counts'] = df['results'].apply(f)
此时counts列的字典里会包含值为0的键值对,比如sample2的counts是{0:0,1:0,2:1,3:3},下面给两种靠谱的去除零值的方法:
方法1:生成counts时直接过滤零值
修改统计函数,只保留出现次数大于0的键值对,从源头解决问题:
def f(lst): cnt = Counter(lst) # 只保留0-3中实际出现过的数,自动排除0次项 return {k: cnt[k] for k in [0,1,2,3] if cnt.get(k, 0) > 0} df['counts'] = df['results'].apply(f)
处理后sample2的counts会变成{2:1,3:3},sample3的是{0:4},完全符合需求。
方法2:对已有的counts列批量处理
如果已经生成了带零值的counts列,直接用lambda遍历过滤每个字典:
df['counts'] = df['counts'].apply(lambda d: {k:v for k,v in d.items() if v != 0})
这个方法不依赖原生成逻辑,不管你之前怎么得到的counts列,都能直接清理掉零值项。
关于你的trim_zeros_in_rows失效原因
大概率是函数逻辑不对——比如你误用了numpy的trim_zeros(它是移除数组首尾的零,不是字典里的零值),或者没遍历到每个字典的键值对做过滤。上面两种方法都是直接针对字典的键值对判断,肯定能生效。
内容的提问来源于stack exchange,提问作者aam
相关产品推荐
相关产品推荐

