所以我想为自己的项目创建一个模块,并希望使用方法。例如,我想做:
from mymodule import *
df = pd.DataFrame(np.random.randn(4,4))
df.mymethod()
似乎我不能使用.myfunc()
因为我认为我只能使用我创建的类的方法。解决方法是将mymethod
作为一个函数并使其pandas.Dataframes
用作变量:
myfunc(df)
我真的不想这样做,无论如何要实现第一个?
答案 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可以同时检查官方文档中讨论的“自定义访问器”和“子类化”方法。