如何用循环在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
相关产品推荐
相关产品推荐

