如何无需重复初始化即可为Pandas DataFrame添加自定义Monkey Patch函数
为Pandas DataFrame添加永久可用的自定义方法
当然可以实现,有两种主流方案,推荐优先使用官方规范的扩展方式:
方案1:使用Pandas官方访问器(推荐)
Pandas提供了pd.api.extensions.register_dataframe_accessor装饰器,专门用于扩展DataFrame的功能。只需要定义一次,导入对应的模块后,所有DataFrame实例都能直接调用自定义方法,无需每次手动赋值。
示例代码:
import pandas as pd # 注册一个名为"my_tools"的访问器 @pd.api.extensions.register_dataframe_accessor("my_tools") class DataFrameCustomTools: def __init__(self, df_obj): self.df = df_obj # 保存DataFrame实例引用 def unique_values(self): """返回每一列的唯一值字典""" return {col: self.df[col].unique().tolist() for col in self.df.columns} def row_count(self): """返回数据框的行数""" return len(self.df) # 直接使用 df = pd.DataFrame({"A": [1, 2, 2], "B": ["foo", "bar", "foo"]}) print(df.my_tools.unique_values()) # 输出: {'A': [1, 2], 'B': ['foo', 'bar']} print(df.my_tools.row_count()) # 输出: 3
这种方式的优势是:
- 不会和Pandas内置方法或其他扩展冲突(通过自定义命名空间区分)
- 支持类型提示,IDE会自动补全方法
- 可以在访问器类中封装多个相关方法,结构更清晰
方案2:全局猴子补丁(不推荐但直接)
如果坚持用传统猴子补丁,可以把补丁代码封装到一个模块中,每次使用Pandas前导入该模块即可实现全局生效。
步骤1:创建补丁模块pandas_custom_patches.py:
import pandas as pd def df_unique_values(self): return {col: self[col].unique().tolist() for col in self.columns} # 给DataFrame类绑定方法 pd.DataFrame.unique_values = df_unique_values
步骤2:在主代码中导入补丁模块:
import pandas as pd import pandas_custom_patches # 导入后自动完成补丁 df = pd.DataFrame({"A": [1, 2, 2], "B": ["foo", "bar", "foo"]}) print(df.unique_values()) # 输出: {'A': [1, 2], 'B': ['foo', 'bar']}
注意:这种方式直接修改pd.DataFrame类,可能会和其他库的补丁或Pandas后续版本的内置方法冲突,风险较高,不推荐在生产环境使用。
内容的提问来源于stack exchange,提问作者helpmeplease
相关产品推荐
相关产品推荐

