You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:12:06