2017-04-19 22 views
1

所以我想爲我自己的項目創建一個模塊並想使用方法。比如我想做的事:爲DataFrames創建我自己的方法(python)

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

事情是,似乎我無法使用.myfunc(),因爲我覺得我只可以使用我創建的類的方法。一個解決正在mymethod的功能,使其佔用pandas.Dataframes作爲變量:

myfunc(df) 

我真的不希望這樣做,反正是有實施的第一個?

+0

你爲什麼不希望把它一個函數?否則,你將不得不繼承或修補數據幀。 – jonrsharpe

+0

根據函數的作用,你可以使用'apply'。例如'df.apply(myfunc)'我意識到這不會創建一個新的方法,但也許它會得到你所需要的東西,至少你可以通過這種方式進行方法鏈接''''df.apply(myfunc)。 apply(myotherfunc)'... – johnchase

+0

剛剛使用'apply'方法怎麼樣?你的方法有多複雜? – blacksite

回答

2

如果你真的需要添加一個方法到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經常返回新dataframes在數據幀上執行操作時。所以爲了保留你的數據框類,你需要在你的類的一個實例上執行操作時返回你的類pandas

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)) 

測試結果:這可以通過提供一個_constructor性質等進行

<class '__main__.MyDataFrame'> 
<class '__main__.MyDataFrame'> 
+1

加上一個努力。但是這不會很困難,因爲在大多數情況下,熊貓只會返回一個數據幀。你必須做一些額外的技巧來覆蓋每個返回'pd.DataFrame'的pd.DataFrame方法。否則,這是一種一次性使用的方法,你很可能回到'pdDataFrame'。 – piRSquared

+0

@piRSquared,你是正常的。但似乎有一個簡單的解決方法。 –

+0

這比我想象的要難,謝謝! – Ryunaq