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

使用Pandas实现DataFrame中NaN值的循环填充问题

解决方案

原始数据

AB
0Abel10
1Ada8
2Beed15
3Calvin13
4NaN6
5NaN17
6NaN35
7NaN12
8NaN20
9NaN19

需求:用A列索引0-3的非NaN值循环填充后续的NaN,期望输出如下:

期望输出

AB
0Abel10
1Ada8
2Beed15
3Calvin13
4Abel6
5Ada17
6Beed35
7Calvin12
8Abel20
9Ada19

问题分析

原代码存在两个关键问题:

  1. 未导入numpy库,np.nan会直接报错,无法生成正确的缺失值;
  2. 使用fillna结合Series填充时,虽逻辑可行但易受索引匹配影响,不如直接生成完整循环序列替换列更可靠。

正确代码

方法一:列表推导式生成循环序列

import pandas as pd
import numpy as np

data = {'A': ['Abel', 'Ada', 'Beed', 'Calvin', np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
        'B': [10, 8, 15, 13, 6, 17, 35, 12, 20, 19]}
df = pd.DataFrame(data)

# 获取用于循环填充的非NaN值列表
fill_list = df['A'].dropna().tolist()
cycle_len = len(fill_list)

# 生成与DataFrame长度一致的循环序列并替换原列
df['A'] = [fill_list[i % cycle_len] for i in range(len(df))]

print(df)

方法二:使用numpy.tile快速生成循环序列

import pandas as pd
import numpy as np

data = {'A': ['Abel', 'Ada', 'Beed', 'Calvin', np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
        'B': [10, 8, 15, 13, 6, 17, 35, 12, 20, 19]}
df = pd.DataFrame(data)

fill_array = df['A'].dropna().to_numpy()
# 生成重复足够次数的序列,截取前len(df)个元素替换原列
df['A'] = np.tile(fill_array, len(df) // len(fill_array) + 1)[:len(df)]

print(df)

两种方法均能直接生成符合要求的循环填充序列,确保从第一个非NaN值开始循环填充后续缺失位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 19:31:03