Pandas按层级逐行填充非0值的实现方案咨询
Pandas按层级逐行向右填充第一个非0值高效方案
你现有的apply逐行迭代方案存在两个问题:一是硬编码只处理了值为2的场景,无法适配示例中的非0值1等其他情况;二是逐行迭代在数据量较大时性能极差,无法发挥Pandas向量化运算的优势。
以下是更合理高效的实现方式:
核心思路
利用Pandas内置的缺失值向前填充能力,三步完成需求:
- 将所有0值替换为缺失值NaN
- 沿行方向(从左到右)做向前填充,把第一个非0值向右传递
- 将剩余未填充的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
相关产品推荐
相关产品推荐

