如何使用pandas删除DataFrame中除ID列外所有值为0或'nan'的行
解决pandas DataFrame行过滤问题
问题原因
你的原有代码存在两处逻辑错误:
- 未排除
id列参与校验:你的需求是仅判断除ID列外的其余列,原代码把ID列也纳入了判断范围 - 聚合逻辑用反:
all(axis=1)要求该行所有列都满足「不等于0且不等于'nan'」才会保留,你需要的是「除ID外的列只要存在至少一个不是0或'nan'就保留」,等价于「剔除除ID外所有列都是0或'nan'的行」。
正确代码
易读版写法
# 生成布尔掩码:除id外的列,只要有一个值不是0也不是'nan'就为True mask = df.drop('id', axis=1).apply(lambda x: (x != 0) & (x != 'nan')).any(axis=1) # 按掩码过滤,加reset_index重置行索引和预期输出完全一致 res = df[mask].reset_index(drop=True)
简洁版写法
res = df[~df.drop('id', axis=1).isin([0, 'nan']).all(axis=1)].reset_index(drop=True)
输出结果
运行后得到的结果和你预期一致:
id a b c 0 2 0 1 1 1 4 1 1 1
内容的提问来源于stack exchange,提问作者b101
相关产品推荐
相关产品推荐

