能否在fillna()中使用for循环?用1~100填充100个NaN的代码可行吗?
关于fillna()中使用for循环替换NaN为1~100的问题
嘿,这个问题问得很实际!先直接给结论:你写的for i in range (1,101): df.fillna(i)完全达不到你想要的效果,原因很简单——每次调用df.fillna(i)都会把DataFrame里所有的NaN一次性替换成当前的i,循环跑完后,所有NaN都会变成最后一次的100,根本做不到“依次替换为1~100”。
那该怎么实现你的需求呢?给你两种靠谱的方法:
方法一:定位NaN位置后逐个赋值
这个方法逻辑最直观,先找到所有NaN的位置,再挨个给它们赋值1到100:
import pandas as pd import numpy as np # 假设你的DataFrame是df,先获取所有NaN的坐标(行、列) nan_positions = list(zip(*np.where(df.isna()))) # 确保NaN的数量正好是100个(如果不是,你可以调整range的范围) for (row, col), num in zip(nan_positions, range(1, 101)): df.iloc[row, col] = num
如果你只需要处理某一列的NaN,代码可以更简单:
# 比如处理'目标列' nan_indices = df[df['目标列'].isna()].index for idx, num in zip(nan_indices, range(1, len(nan_indices)+1)): df.loc[idx, '目标列'] = num
方法二:用迭代器配合applymap(更简洁)
可以用itertools.count创建一个从1开始的迭代器,然后遍历每个元素,遇到NaN就取迭代器的下一个值:
import pandas as pd from itertools import count counter = count(1) df = df.applymap(lambda x: next(counter) if pd.isna(x) else x)
这个方法要注意:如果DataFrame里的NaN数量多于100,它会继续往后数(比如101、102...);如果少于100,迭代器会剩下没用到的数字,根据你的实际情况调整就行。
总结一下,你的初始思路问题出在对fillna()的理解——它是全局替换所有NaN,而不是逐个替换。上面两种方法都能实现“把100个NaN依次替换为1100”的需求
内容的提问来源于stack exchange,提问作者user13506230
相关产品推荐
相关产品推荐

