You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需重复初始化即可为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:53:09