如何自动化pandas DataFrame数据清洗并解决fillna相关报错问题?
错误原因说明
- ValueError:函数中执行
df['Fare'].fillna()时未传入提前计算好的均值参数,fillna方法缺少必填的填充值/方法参数触发报错。 - SettingWithCopyWarning:传入函数的DataFrame是其他数据对象的切片视图,直接在原视图上赋值触发pandas的副本修改预警,防止数据误改。
修复后的基础版本
直接修正原有函数的两个问题即可正常运行:
def data_cleaning(df): # 先创建数据副本,避免修改原切片触发警告 res_df = df.copy() # 按pandas推荐的loc方式赋值 res_df.loc[:, 'Age'] = res_df['Age'].fillna(0) fare_mean = res_df['Fare'].mean() res_df.loc[:, 'Fare'] = res_df['Fare'].fillna(fare_mean) return res_df
调用方式和原有逻辑一致:
train_data = data_cleaning(train_data)
高扩展性通用清洗方案
如果后续需要适配更多列、不同填充规则的需求,可以用下面的通用函数,不需要修改函数内部,仅通过参数配置即可完成不同填充逻辑:
def general_data_cleaning(df, fill_config): """ 通用缺失值填充函数 fill_config:填充规则字典,key为列名,value支持固定填充值/内置规则,内置规则可选'mean'(均值)、'median'(中位数)、'mode'(众数) """ res_df = df.copy() for col, rule in fill_config.items(): # 根据规则计算填充值 if rule == 'mean': fill_val = res_df[col].mean() elif rule == 'median': fill_val = res_df[col].median() elif rule == 'mode': fill_val = res_df[col].mode()[0] else: fill_val = rule # 执行填充 res_df.loc[:, col] = res_df[col].fillna(fill_val) return res_df
调用示例:
# 配置填充规则,后续新增列直接在该字典中添加配置即可 fill_config = { 'Age': 0, 'Fare': 'mean' } train_data = general_data_cleaning(train_data, fill_config) cross_val_data = general_data_cleaning(cross_val_data, fill_config)
内容的提问来源于stack exchange,提问作者Tejas Rao
相关产品推荐
相关产品推荐

