2017-04-19 3 views
1

私は自分のプロジェクトのためのモジュールを作成したいと思っていましたし、メソッドを使いたいと思っていました。例えば、私がやってみたかった:DataFrames(python)の独自のメソッドを作成する

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

ことは、私が唯一の私が作成したクラスのためのメソッドを使用することができると思うので、私は.myfunc()を使用することはできませんようですです。仕事は周りの機能mymethodを作り、それを変数としてpandas.Dataframesを使用し作っている:私は本当にこれを行うにはしたくない

myfunc(df) 

、最初のものを実装するためにとにかくありますか?

+0

それは次のように_constructorプロパティを提供することによって行うことができます機能?それ以外の場合は、データフレームをサブクラス化またはパッチする必要があります。 – 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は定期的に新しいデータフレームを返します。データフレーム上で操作を実行するときしたがって、データフレームクラスを保持するには、クラスのインスタンスに対して操作を実行するときに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)) 

試験結果:あなたはそれをしたくないのはなぜ

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

と努力のために1つ。しかし、パンダはたいていの場合データフレームを返すだけなので、これは難しくありません。 'pd.DataFrame'を返すすべてのpd.DataFrameメソッドをオーバーライドするには、いくつかのトリッキーを追加する必要があります。さもなければ、これは1つの使用方法であり、あなたは 'pdDataFrame'に戻ります。 – piRSquared

+0

@piRSquared、あなたはいつものとおりです。しかし、簡単な回避策があるようです。 –

+0

これは私が思っていたよりも難しかった、ありがとう! – Ryunaq

関連する問題