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

时间:2017-04-19 19:04:01

标签: python pandas methods module

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

from mymodule import *
df = pd.DataFrame(np.random.randn(4,4))
df.mymethod()

似乎我不能使用.myfunc()因为我认为我只能使用我创建的类的方法。解决方法是将mymethod作为一个函数并使其pandas.Dataframes用作变量:

myfunc(df)

我真的不想这样做,无论如何要实现第一个?

3 个答案:

答案 0 :(得分:3)

如果确实需要向pandas.DataFrame添加方法,则可以从中继承。类似的东西:

<强> MyModule的:

import pandas as pd

class MyDataFrame(pd.DataFrame):
    def mymethod(self):
        """Do my stuff"""

使用mymodule:

from mymodule import *
df = MyDataFrame(np.random.randn(4,4))
df.mymethod()

保留自定义数据框类:

pandas在对数据帧执行操作时会定期返回新的数据帧。因此,为了保留您的数据框类,您需要在对类的实例执行操作时让pandas返回您的类。这可以通过提供_constructor属性来完成,例如:

class MyDataFrame(pd.DataFrame):

    @property
    def _constructor(self):
        return MyDataFrame

    def mymethod(self):
        """Do my stuff"""

测试代码:

class MyDataFrame(pd.DataFrame):

    @property
    def _constructor(self):
        return MyDataFrame

df = MyDataFrame([1])
print(type(df))
df = df.rename(columns={})
print(type(df))

测试结果:

<class '__main__.MyDataFrame'>
<class '__main__.MyDataFrame'>

答案 1 :(得分:3)

好的解决方案可以在ffn软件包中找到。作者做什么:

from pandas.core.base import PandasObject
def your_fun(df):
    ...
PandasObject.your_fun = your_fun

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

df.your_fun()

此方法将可以同时用于DataFrame和Series对象

答案 2 :(得分:0)

截至2019年11月,该主题的文献记录丰富:Extending pandas

请注意,最明显的技术-伊凡·米沙金(Ivan Mishalkin)的猴子修补术-实际上在官方文档中的某个时候被删除了……可能是有充分的理由。

猴子修补程序在小型项目中可以很好地工作,但是对于大型项目则存在严重的缺点:像Pycharm这样的IDE不能自检修补的方法。因此,如果右键单击“转到声明”,Pycharm会简单地说“找不到要转到的声明”。如果您是IDE迷,它会很快变老。

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