如何将列表非零值填充至相邻索引?Pandas DataFrame行处理问题
问题分析与解决
原代码问题
你的循环逻辑存在两个核心问题:
- 循环中直接修改原列表导致后续判断失效:当处理到
2022(索引1)时,你把索引0和2都改成了2022,后续循环到索引2时,这个位置已经是2022了,会再次触发修改操作,把索引1和3也改成2022,最终所有元素都会被覆盖成第一个出现的非0值。 - 逻辑不符合需求:你的代码只修改了当前非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
相关产品推荐
相关产品推荐

