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

如何用循环在Python中为DataFrame缺失值标记带序号的自定义标签?

问题分析与解决方案

原代码的核心错误

  • NaN比较逻辑错误:不能用value == nan判断缺失值,NaN的特性是不等于任何值(包括自身),必须用pd.isna()或np.isnan()。
  • apply方法误用:apply是对Series的每个元素批量应用函数,这里直接对单个缺失元素赋值即可,无需调用apply。
  • 计数逻辑错误:原代码用元素的位置索引i作为缺失值的序号,但实际需要的是缺失值的出现顺序,而非元素在序列中的位置。

修正后的循环实现代码

import pandas as pd
from numpy import nan  # 推荐用numpy的nan,pandas对其支持更完善

# 初始化目标DataFrame
student_card = pd.DataFrame({'ID':[20190103, 20190222, 20190531],
                             'name':['Kim', nan, nan],
                             'class':['H', 'W', 'S']})

def fillna_func(series):
    series_copy = series.copy()  # 复制原Series,避免修改原始数据
    missing_count = 1  # 记录当前是第几个缺失值
    for idx, val in series_copy.items():
        if pd.isna(val):
            series_copy[idx] = f'missing{missing_count}'
            missing_count += 1
    return series_copy

# 应用函数并更新原DataFrame的name列
student_card['name'] = fillna_func(student_card['name'])
print(student_card)

更高效的pandas批量处理方案(无需循环)

如果数据量较大,推荐用pandas的掩码批量处理,比循环执行效率更高:

import pandas as pd
from numpy import nan

student_card = pd.DataFrame({'ID':[20190103, 20190222, 20190531],
                             'name':['Kim', nan, nan],
                             'class':['H', 'W', 'S']})

# 筛选出name列的所有缺失值位置
na_mask = student_card['name'].isna()
# 生成对应数量的缺失标签并批量赋值
student_card.loc[na_mask, 'name'] = [f'missing{i+1}' for i in range(na_mask.sum())]

print(student_card)

最终输出结果

ID      name class
0  20190103       Kim     H
1  20190222  missing1     W
2  20190531  missing2     S

内容的提问来源于stack exchange,提问作者Se Bi Y

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:30:53