为DataFrames创建我自己的方法(python)

Shi*_*nai 2 python methods module pandas

因此,我想为自己的项目创建一个模块,并希望使用方法。例如,我想做:

from mymodule import *
df = pd.DataFrame(np.random.randn(4,4))
df.mymethod()
Run Code Online (Sandbox Code Playgroud)

看来我无法使用,.myfunc()因为我认为只能为自己创建的类使用方法。解决方法是制作mymethod一个函数并将其pandas.Dataframes用作变量:

myfunc(df)
Run Code Online (Sandbox Code Playgroud)

我真的不想要这样做,还是有实现第一个的方法吗?

Iva*_*kin 8

好的解决方案可以在ffn包中找到。作者的工作:

from pandas.core.base import PandasObject
def your_fun(df):
    ...
PandasObject.your_fun = your_fun
Run Code Online (Sandbox Code Playgroud)

之后,您的手动函数“ your_fun”将成为pandas.DataFrame对象的方法,您可以执行以下操作

df.your_fun()
Run Code Online (Sandbox Code Playgroud)

此方法将能够与DataFrame和Series对象一起使用

  • @monkeyintern 在过时的文档中有“monkey-patching”名称 https://pandas.pydata.org/pandas-docs/version/0.15/faq.html#adding-features-to-your-pandas-installation ,但是我发现不是熊猫特有的,而是在这里添加方法的通用方法https://medium.com/@mgarod/dynamically-add-a-method-to-a-class-in-python-c49204b85bd6 (3认同)

Ste*_*uch 6

如果确实需要向中添加方法,则pandas.DataFrame可以从中继承。就像是:

mymodule:

import pandas as pd

class MyDataFrame(pd.DataFrame):
    def mymethod(self):
        """Do my stuff"""
Run Code Online (Sandbox Code Playgroud)

使用mymodule:

from mymodule import *
df = MyDataFrame(np.random.randn(4,4))
df.mymethod()
Run Code Online (Sandbox Code Playgroud)

要保留您的自定义数据框类:

pandas对数据帧执行操作时,通常会返回新的数据帧。因此,要保留数据框类,则需要在对pandas类的实例执行操作时返回类。可以通过提供如下_constructor属性来实现:

class MyDataFrame(pd.DataFrame):

    @property
    def _constructor(self):
        return MyDataFrame

    def mymethod(self):
        """Do my stuff"""
Run Code Online (Sandbox Code Playgroud)

测试代码:

class MyDataFrame(pd.DataFrame):

    @property
    def _constructor(self):
        return MyDataFrame

df = MyDataFrame([1])
print(type(df))
df = df.rename(columns={})
print(type(df))
Run Code Online (Sandbox Code Playgroud)

检测结果:

<class '__main__.MyDataFrame'>
<class '__main__.MyDataFrame'>
Run Code Online (Sandbox Code Playgroud)

  • 加一个努力。但这并不困难,因为在大多数情况下,熊猫只会返回一个数据框。您必须做一些额外的技巧才能覆盖返回pd.DataFrame的每个pd.DataFrame方法。否则,这是一种使用方法,很可能您会返回到`pdDataFrame`...。 (2认同)

pan*_*hef 6

截至 2019 年 11 月,该主题已有详细记录:扩展大熊猫

请注意,最明显的技术——Ivan Mishalkin 的猴子补丁——实际上在官方文档中的某个时候被删除了......可能有充分的理由。

Monkey 补丁对于小型项目很有效,但对于大型项目有一个严重的缺点:像 Pycharm 这样的 IDE 无法内省补丁方法。因此,如果右键单击“转到声明”,Pycharm 只会说“找不到要转到的声明”。如果您是 IDE 迷,它会很快变老。

我确认 Pycharm 可以内省官方文档中讨论的“自定义访问器”和“子类化”方法。

  • 这就是现在最好的答案! (2认同)