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

如何按条件对pandas DataFrame执行指定值修改操作

Pandas按日期分组修改字段值实现方案

核心逻辑梳理

需求按以下规则处理数据:

  • 以date列分组,同一天的数据独立计算,不跨天影响
  • 每组内按原有行顺序判断,找到condition_1为True的行位置
  • 同组内所有排在该位置之前、且condition_2为True的行,将condition_2修改为NaN
  • 已知约束:不存在同一行condition_1和condition_2同时为True的情况,无需处理冲突

方案1:pandas原生向量化实现(推荐)

该方案依托pandas分组API实现,底层做了性能优化,无论数据量大小都有稳定的执行效率,是生产环境首选方案。
注意原测试代码中pd.to_datetime没有将结果赋值回列,需要先修正该问题,完整代码如下:

import pandas as pd
# 构造测试数据
tbl = {"date" :["2022-02-27", "2022-02-27", "2022-02-27", "2022-02-28", "2022-02-28","2022-02-28"],
        "condition_1" : ["True", "NaN", "NaN", "NaN", "True", "NaN"],
        "condition_2" : ["NaN", "NaN", "True", "True", "NaN", "NaN"]}
df = pd.DataFrame(tbl)
df = df.replace('NaN', float('nan'))
# 修正:将转换后的日期赋值回date列
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')
df.sort_values(by = "date", inplace=True)
df = df.reset_index(drop=True)

# 核心处理逻辑
def process_daily_group(group):
    # 找到当前日期组内第一个condition_1为True的行索引
    cond1_true_positions = group.index[group['condition_1'] == True]
    # 当天无cond1为True的行,直接返回原数据
    if len(cond1_true_positions) == 0:
        return group
    first_cond1_idx = cond1_true_positions[0]
    # 将cond1首次出现前、cond2为True的行的cond2置为NaN
    group.loc[(group.index < first_cond1_idx) & (group['condition_2'] == True), 'condition_2'] = pd.NA
    return group

df = df.groupby('date', group_keys=False).apply(process_daily_group)

方案2:for循环+if条件判断实现

该逻辑完全可以通过for循环搭配条件判断实现,优点是逻辑直白易读,缺点是逐行遍历性能差,仅适合千行以内的极小数据集快速验证使用,代码如下:

# 前置数据排序、类型转换和上述方案一致,此处省略重复代码
current_process_date = None
has_seen_cond1 = False

for idx, row in df.iterrows():
    # 切换到新的日期时重置标记位
    if row['date'] != current_process_date:
        current_process_date = row['date']
        has_seen_cond1 = False
    # 碰到cond1为True的行,更新标记,后续行无需再置空cond2
    if row['condition_1'] == True:
        has_seen_cond1 = True
        continue
    # 未碰到当日cond1=True前,出现的cond2=True全部置为NaN
    if not has_seen_cond1 and row['condition_2'] == True:
        df.loc[idx, 'condition_2'] = pd.NA

处理结果验证

执行上述任意一种方案后,输出结果符合预期:

  • 2022-02-27分组:condition_1为True的行在组内第一行,其后方第三行的condition_2=True保留,不做修改
  • 2022-02-28分组:condition_1为True的行在组内第二行,其前方第一行的condition_2=True被置为NaN

内容的提问来源于stack exchange,提问作者Pren Ven

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:03:42