如何替换Pandas DataFrame指定列中特定值之后的所有元素
Pandas DataFrame指定列触发值后元素批量替换方案
首先修正示例数据构造的语法错误(原代码列名引号缺失、维度不匹配):
import pandas as pd df = pd.DataFrame([ [12, 4, 1, 2, 4], [13, 10, 3, 4, 2], [14, 5, 5, 1, 6], [15, 6, 4, 8, 7], [16, 1, 9, 3, 1], [17, 3, 1, 4, 8] ], columns=['ID', 'time', 'A', 'B', 'C'])
核心实现代码
通过累积布尔掩码实现精准定位触发值之后的位置,支持批量配置规则:
# 配置替换规则:格式为 (目标列名, 触发值, 替换值) replace_rules = [ ('A', 5, 1), ('B', 1, 6), ('C', 7, 5) ] for col, trigger, replace_val in replace_rules: # 生成掩码:仅首次出现触发值之后的位置为True mask = df[col].eq(trigger).cummax().shift(fill_value=False) df.loc[mask, col] = replace_val
逻辑说明
df[col].eq(trigger):返回布尔序列,元素等于触发值的位置标记为Truecummax():累积最大值运算,第一次出现True后,后续所有位置都保持True,可标记出触发值及之后的全部位置shift(fill_value=False):将布尔序列后移一位,触发值本身的位置改为False,最终仅保留需要替换的触发值之后的位置- 若目标列从未出现触发值,掩码全为
False,不会执行任何替换,自动兼容该场景
运行后输出的df和预期结果完全一致:
ID time A B C 0 12 4 1 2 4 1 13 10 3 4 2 2 14 5 5 1 6 3 15 6 1 6 7 4 16 1 1 6 5 5 17 3 1 6 5
内容的提问来源于stack exchange,提问作者Felipe Araya Olea
相关产品推荐
相关产品推荐

