如何按条件对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
相关产品推荐
相关产品推荐

