如何移除DataFrame中单日试验至少2个零值的行?
解决方案
可以通过按日期分组统计零值数量的方式实现需求,核心思路是分别检查每一天的三次试验数据,标记出任意一天零值≥2的行,再过滤掉这些行。
方法一:循环遍历日期组
先构造示例数据方便测试:
import pandas as pd # 构造示例DataFrame data = { '蛋白质名称': ['蛋白A', '蛋白B', '蛋白C', '蛋白D'], 'day1_trial1': [0, 1, 0, 5], 'day1_trial2': [0, 2, 3, 0], 'day1_trial3': [3, 0, 0, 0], 'day2_trial1': [1, 0, 4, 0], 'day2_trial2': [2, 0, 5, 0], 'day2_trial3': [3, 3, 6, 1] } df = pd.DataFrame(data)
执行过滤逻辑:
# 提取所有日期分组(比如day1、day2) day_groups = df.columns[1:].str.extract('(day\\d+)')[0].unique() # 初始化标记数组,默认所有行都保留 mask = pd.Series([False] * len(df), index=df.index) for day in day_groups: # 获取当前日期对应的所有试验列 day_cols = [col for col in df.columns if col.startswith(day)] # 统计每行在当前日期组中的零值数量 zero_count = (df[day_cols] == 0).sum(axis=1) # 标记出零值≥2的行 mask = mask | (zero_count >= 2) # 过滤掉被标记的行 filtered_df = df[~mask]
方法二:用groupby简化代码(更简洁)
利用groupby按日期列分组,一次性完成统计和判断:
# 按列名中的日期部分分组,统计每组零值数量是否≥2,再判断任意组满足条件的行 mask = df.iloc[:, 1:].groupby( df.columns[1:].str.extract('(day\\d+)')[0], axis=1 ).apply(lambda x: (x == 0).sum(axis=1) >= 2).any(axis=1) # 过滤结果 filtered_df = df[~mask]
结果说明
以示例数据为例,过滤后仅保留蛋白C:
蛋白质名称 day1_trial1 day1_trial2 day1_trial3 day2_trial1 day2_trial2 day2_trial3 2 蛋白C 0 3 0 4 5 6
- 蛋白A的day1组有2个零值,被移除
- 蛋白B的day2组有2个零值,被移除
- 蛋白D的day1和day2组均有2个零值,被移除
内容的提问来源于stack exchange,提问作者planckton
相关产品推荐
相关产品推荐

