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

Pandas按层级逐行填充非0值的实现方案咨询

Pandas按层级逐行向右填充第一个非0值高效方案

你现有的apply逐行迭代方案存在两个问题:一是硬编码只处理了值为2的场景,无法适配示例中的非0值1等其他情况;二是逐行迭代在数据量较大时性能极差,无法发挥Pandas向量化运算的优势。

以下是更合理高效的实现方式:

核心思路

利用Pandas内置的缺失值向前填充能力,三步完成需求:

  1. 将所有0值替换为缺失值NaN
  2. 沿行方向(从左到右)做向前填充,把第一个非0值向右传递
  3. 将剩余未填充的NaN(对应整行全为0的情况)换回0,再转回整数类型即可

实现代码

import pandas as pd

# 构造示例输入数据
data = {
    'Level1 - Code' : [0, 0, 0, 2],
    'Level2 - Code' : [0, 1, 0, 0],
    'Level3 - Code' : [2, 0, 0, 0],
    'Level4 - Code' : [0, 0, 0, 0]
}
df = pd.DataFrame(data)

# 核心处理逻辑
df_output = df.replace(0, float('nan')).ffill(axis=1).fillna(0).astype(int)

# 输出验证
print(df_output)

方案优势

  • 逻辑简洁:无需自定义函数和逐行迭代,核心逻辑仅一行代码
  • 性能优异:全部调用Pandas内置向量化运算接口,万行以上数据量下性能是apply方案的数十倍
  • 兼容性强:自动适配所有非0值,无需硬编码判断特定数值,可直接扩展到更多层级的列

如果你的原始数据中存在合法NaN值,不想和0替换产生的NaN混淆,可以用mask方法替代replace,效果一致:

df_output = df.mask(df.eq(0)).ffill(axis=1).fillna(0).astype(int)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:36:03