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

pandas如何将行内值替换为该行首个非零值 空行替换为0.0

问题解决实现

原代码存在的问题

  • 空值识别失效:你为D列赋值的""是空字符串,不属于pandas默认识别的空值类型,isnull()方法无法检测,需要先统一转换为np.nan。
  • 首个非零值获取逻辑错误:cumsum(axis=1).min(axis=1)的逻辑无法正确提取每行从左到右的第一个非零值,需要先将0值转为空值后按行取第一个有效值。
  • 替换逻辑语法错误:df.any(axis=1).replace(df, first_nonzero_df)的写法不符合replace方法的调用规则,any()返回的布尔序列无法直接替换原DataFrame的数值。

正确实现代码

import pandas as pd
import numpy as np

# 构造原始数据
data = {
    'VOL1': [0, 21, 19, 18],
    'VOL2': [1, 21, 0, 0],
    'D': [3, "", 0, ""]
}
df = pd.DataFrame(data)

# 统一空值格式,将空字符串转为np.nan
df = df.replace("", np.nan)

# 计算每行从左到右的第一个非零非空值
# 先把0替换为nan,按行向后填充后取第一列即为每行首个非零值
row_first_nonzero = df.replace(0, np.nan).bfill(axis=1).iloc[:, 0]

# 按规则生成结果:非空位置替换为该行首个非零值,空位置替换为0.0
result = df.apply(
    lambda row: [row_first_nonzero[row.name] if pd.notna(val) else 0.0 for val in row],
    axis=1,
    result_type='expand'
)
result.columns = df.columns

# 输出结果
print(result)

输出结果验证

运行上述代码后输出结果如下,完全匹配预期:

VOL1  VOL2     D
0   1.0   1.0   1.0
1  21.0  21.0   0.0
2  19.0  19.0  19.0
3  18.0  18.0   0.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:09:04