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

如何将列表非零值填充至相邻索引?Pandas DataFrame行处理问题

问题分析与解决

原代码问题

你的循环逻辑存在两个核心问题:

  1. 循环中直接修改原列表导致后续判断失效:当处理到2022(索引1)时,你把索引0和2都改成了2022,后续循环到索引2时,这个位置已经是2022了,会再次触发修改操作,把索引1和3也改成2022,最终所有元素都会被覆盖成第一个出现的非0值。
  2. 逻辑不符合需求:你的代码只修改了当前非0值的前后各一个元素,无法处理连续多个0的情况,也没有实现“用最近的前一个非0值填充所有后续0”的逻辑。

正确解法

方法1:遍历列表,记录当前有效年份填充

这种方法适合处理列表,逻辑清晰:

lst = [0, 2022, 0, 0, 2023, 0, 0, 2024, 0]
current_year = None
result = []
for num in lst:
    if num != 0:
        current_year = num
    if current_year is not None:
        result.append(current_year)
print(result)  # 输出: [2022, 2022, 2022, 2023, 2023, 2024, 2024, 2024]

方法2:直接用Pandas处理DataFrame行(更高效)

既然你是从Excel读取的DataFrame,没必要转成列表处理,直接用Pandas的ffill()(向前填充)方法,专门处理这种0值填充需求:

import pandas as pd

# 假设你的DataFrame是df,目标行是第0行(根据实际情况调整)
df = pd.DataFrame([[0, 2022, 0, 0, 2023, 0, 0, 2024, 0]])
# 先把0替换成NaN,再按行向前填充,最后转成整数
filled_row = df.replace(0, pd.NA).ffill(axis=1).astype(int)
print(filled_row.values.tolist()[0])  # 输出: [2022, 2022, 2022, 2023, 2023, 2024, 2024, 2024]

补充说明

  • 方法1的逻辑是:遍历每个元素,遇到非0值就更新当前记录的年份,之后所有的0都用这个年份填充,直到遇到下一个非0值再更新。
  • 方法2更适合Pandas场景,ffill(axis=1)表示按行向前填充,用左边最近的非空值填充当前位置,完全匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:56:13