如何正确使用pd.isna避免类型错误?填充宗教缺失值遇报错
排查用同住户宗教值填充DataFrame缺失值的代码错误
核心错误点梳理
isna()调用方式错误:cd.isna(row['Religion'])写法错误,DataFrame.isna()无需额外传参,检查单个标量值的空值应该用pd.isna(row['Religion'])。- 函数名不匹配:定义的函数是
fill_religion,但调用时写的是fill_missing_religion,名称不一致导致无法正确调用目标函数。 get_group()参数格式错误:分组后的get_group()需要传入元组作为分组键,正确写法是grouped_data.get_group((row['House Number'], row['Street'])),而非两个单独参数。- 变量名拼写错误:函数内将定义的
religions误写为religion(len(religion)、return religion[0]),会触发未定义变量的报错。 - 未定义变量引用:代码中出现未定义的
line变量(line['House Number']),应改为row。
修正后的完整代码
import pandas as pd def fill_religion(row, grouped_data): if pd.isna(row['Religion']): home_group = grouped_data.get_group((row['House Number'], row['Street'])) religions = home_group['Religion'].dropna().unique() if len(religions) == 1: return religions[0] else: return 'Unknown' else: return row['Religion'] # 按住户编号和街道分组 grouped_data = cd.groupby(['House Number','Street']) # 应用函数填充缺失值 cd['Religion'] = cd.apply(lambda row: fill_religion(row, grouped_data), axis=1)
更高效的替代方案
逐行apply效率较低,针对大数据集可以用pandas原生分组变换方法实现:
def get_group_mode(series): modes = series.mode() return modes[0] if len(modes) == 1 else 'Unknown' # 生成每个分组的填充值 fill_values = cd.groupby(['House Number','Street'])['Religion'].transform(get_group_mode) # 填充缺失值 cd['Religion'] = cd['Religion'].fillna(fill_values)
内容的提问来源于stack exchange,提问作者Francis
相关产品推荐
相关产品推荐

