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

如何在Pandas DataFrame中将首次出现ONE-OFF后的列设为NaN

解决方案:将DataFrame每行首次出现"ONE-OFF"后的列设为NaN

我们需要处理Pandas DataFrame:对每行来说,找到第一个值为"ONE-OFF"的列,把该列之后的所有列值替换为NaN;如果某行没有"ONE-OFF",则保持该行不变。

步骤1:导入必要库

import pandas as pd
import numpy as np

步骤2:核心处理函数

def mask_after_first_one_off(df):
    # 获取每行第一个"ONE-OFF"的列索引,无匹配则返回第一个列索引(后续掩码会自动跳过该行)
    first_off_pos = df.eq('ONE-OFF').idxmax(axis=1)
    # 生成与DataFrame形状一致的列索引矩阵,用于逐行位置比较
    col_indices = np.tile(df.columns, (len(df), 1))
    # 生成掩码:标记每行中在第一个"ONE-OFF"之后的列
    mask = col_indices > first_off_pos.values[:, np.newaxis]
    # 复制原数据避免修改原始输入
    result_df = df.copy()
    # 应用掩码将对应位置设为NaN
    result_df[mask] = np.nan
    return result_df

步骤3:测试示例输入

# 示例输入
input_df = pd.DataFrame(
    {
         1: {'15': 'Normal'},
         2: {'15': 'Normal'},
         3: {'15': 'Normal'},
         4: {'15': 'ONE-OFF'},
         5: {'15': 'Normal'},
         6: {'15': 'Normal'},
    }
)

# 处理得到结果
output_df = mask_after_first_one_off(input_df)
print(output_df)

运行后输出与示例一致:

1       2       3       4    5    6
15  Normal  Normal  Normal  ONE-OFF  NaN  NaN

代码逻辑说明

  • df.eq('ONE-OFF').idxmax(axis=1):逐行判断值是否为"ONE-OFF",返回每行第一个匹配项的列索引;无匹配时返回首列索引,后续比较会确保该行无修改。
  • col_indices:将列索引重复为与DataFrame行数一致的矩阵,实现逐行的列位置对比。
  • 布尔掩码mask:标记所有需要替换为NaN的位置,最后通过掩码批量赋值完成修改。

边界情况验证

如果存在无"ONE-OFF"的行,函数会自动保留该行原始数据:

test_df = pd.DataFrame(
    {
         1: {'10': 'Normal', '15': 'Normal'},
         2: {'10': 'Normal', '15': 'ONE-OFF'},
         3: {'10': 'Normal', '15': 'Normal'},
         4: {'10': 'Normal', '15': 'Normal'},
    }
)

result_df = mask_after_first_one_off(test_df)
print(result_df)

输出:

1       2       3       4
10  Normal  Normal  Normal  Normal
15  Normal  ONE-OFF     NaN     NaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:00:58