Python自定义DataFrame删列+dropna过滤函数写法及调用问题
DataFrame通用过滤函数问题解答
1. 符合需求的通用函数实现
你之前写的函数存在三个核心问题:
- 把列删除、缺失值删除两个操作的
axis参数绑定为同一个变量,无法适配两个操作参数独立配置的需求,实际上删除列的操作axis固定为1,不需要额外暴露参数调整 - 对传入的列名参数做了固定列表包裹,既不兼容多列列表输入,也没有做不存在列的容错,很容易触发“列未找到”的报错
- 调用
dropna()时没有将返回结果重新赋值,pandas默认不做原地修改,这行代码的处理结果根本不会生效
正确实现的代码如下:
import pandas as pd def filtered_df(data, drop_cols, dropna_axis=0, ignore_missing_cols=True): # 兼容单个列名字符串、多列列表两种输入格式 if isinstance(drop_cols, str): drop_cols = [drop_cols] # 执行删列操作,通过errors参数配置是否忽略不存在的列 processed_df = data.drop( columns=drop_cols, axis=1, errors="ignore" if ignore_missing_cols else "raise" ) # 执行缺失值过滤,重新赋值保证操作生效 processed_df = processed_df.dropna(axis=dropna_axis) return processed_df
对应你之前两个业务场景的调用方式:
# 处理gross数据集,删除genre、rating、total_gross三列,默认按行过滤缺失值 total_adj_gross = filtered_df(gross, drop_cols=['genre','rating', 'total_gross']) # 处理characters数据集,删除hero、song两列,显式指定按行过滤缺失值 vill = filtered_df(characters, drop_cols=['hero','song'], dropna_axis=0)
默认开启的ignore_missing_cols=True参数会自动跳过传入列名里不存在于DataFrame的字段,不会触发列不存在的报错;如果需要严格校验列名正确性,把该参数设为False即可,和pandas原生drop方法的报错行为一致。
2. 自定义函数的调用规则
自定义函数不需要必须保存为.py脚本才能调用。
测试阶段你可以直接把函数定义代码写在当前的运行环境中——不管是Jupyter Notebook单元格、VS Code/PyCharm的交互控制台,还是普通.py脚本的开头位置,只要先运行完函数定义的代码段,后续代码就可以直接调用该函数,和调用pandas等第三方库的内置函数没有区别。
只有当你需要跨不同脚本、跨不同notebook文件复用这个函数的时候,才需要把函数单独存为.py文件,通过import语法导入使用。
内容的提问来源于stack exchange,提问作者snealvala
相关产品推荐
相关产品推荐

