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

如何使用Pandas转换数据:替换首非零值前的0为NaN

如何用Pandas将首非零值前的0替换为NaN,保留后续0值

需求说明

需要将数据列中第一个非零值之前的所有0值替换为NaN,同时保留第一个非零值之后的所有0值。以下是输入输出示例:

输入数据

DateItemQuantity
2022-01-01A0
2022-01-02B0
2022-01-03C0
2022-01-04B5
2022-01-05B6
2022-01-06B7
2022-01-07B0

输出结果

DateItemQuantity
2022-01-01ANaN
2022-01-02BNaN
2022-01-03CNaN
2022-01-04B5
2022-01-05B6
2022-01-06B7
2022-01-07B0

实现方案

核心思路

  1. 定位目标列中第一个非零值的索引位置
  2. 对该索引之前的行,将其中的0值替换为NaN
  3. 处理全零列的边界情况(可选)

代码实现

import pandas as pd
import numpy as np

# 构造示例数据(替换为你的实际数据即可)
data = {
    'Date': ['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04', '2022-01-05', '2022-01-06', '2022-01-07'],
    'Item': ['A', 'B', 'C', 'B', 'B', 'B', 'B'],
    'Quantity': [0, 0, 0, 5, 6, 7, 0]
}
df = pd.DataFrame(data)

# 处理逻辑
target_col = 'Quantity'
# 检查是否存在非零值
has_non_zero = df[target_col].ne(0).any()

if has_non_zero:
    # 获取第一个非零值的索引
    first_non_zero_idx = df[target_col].ne(0).idxmax()
    # 将首非零值之前的0替换为NaN
    df.loc[:first_non_zero_idx - 1, target_col] = df.loc[:first_non_zero_idx - 1, target_col].replace(0, np.nan)
else:
    # 全零列的情况:将所有0替换为NaN
    df[target_col] = df[target_col].replace(0, np.nan)

# 查看结果
print(df)

代码解释

  • df[target_col].ne(0):生成布尔序列,非零值对应True,零值对应False
  • .idxmax():返回布尔序列中第一个True值的索引,即第一个非零值的位置
  • df.loc[:first_non_zero_idx - 1, target_col]:选中第一个非零值之前的所有行的目标列
  • .replace(0, np.nan):将选中范围内的0值替换为NaN

内容的提问来源于stack exchange,提问作者Shounak Sushanta Dasgupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:36:33