2017-12-21 14 views
1

最初の質問:私自身のメソッドや関数でデータフレームクラスを

私はパンダで働いているデータフレームと、私は頻繁にデータの前処理や他の部分と同じルーチンを実行していますもの。これらのルーチンのいくつかを、というクラスのメソッドとして、pandas.DataFrameまで拡張したいと思います。私はこれについてどうやって行くのか分かりません。それはpandas.DataFrameから継承されていますように、これまでのところ、私は私の新しいクラス内の任意の__init__を書いていないよ:

import pandas 
class ExtendedDataframe(pandas.DataFrame): 
    def some_method(self): 
    blahblah 

これは明らかに継承によってExtendedDataframeのインスタンスを作成するために私を可能にします。しかし、私は通常pandas.read_csvのようなものでデータをロードしています。これは古典的なDataFrameを返します。どのように標準のDataFrameで提供されるものの上に、私の独自のメソッドを使用するために、そのようなCSVデータを読み込み、ある時点でExtendedDataframeに入れることができますか?ローディングフェーズで標準DataFrameが返されてExtendedDataframeに変換されても問題ありません。

2番目の質問:

わけではありません、私が使用しているすべてのパンダの機能は、データフレームのメソッドです。いくつかは、DataFramesを引数として取る関数、たとえばpandas.mergeです。どうすればそのような関数の使用を私のExtendedDataframeクラスのインスタンスにまで拡張できますか?言い換えれば、もしdf1df2ExtendedDataframeの2つのインスタンスは、私はちょうどそれがDataFrameの標準インスタンスの場合と同様に

pandas.merge([df1, df2], ...) 

作品を作るのですか、ですか?

答えて

1

これはあなたの質問に直接答えませんが、あなたの問題に対する潜在的な答えです。多くの人がワークフローでパイプメソッドを使用します。

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.pipe.html

代わりの

df = foo(df) 

を言って、あなたは

df = df.pipe(foo) 

を言うことができるあなたも、関数の引数を指定することができます!これは、データフレームクラス全体をカプセル化しようとするよりもはるかに簡単です。つまり、関数のライブラリを作成し、必要に応じてパイプするだけです。

+0

これは確かに可能な解決策です、ありがとう!そうでなければ、組み込みクラスに単にメソッドや属性を追加する一般的な方法がありますか? – Ben

+0

あなたが実行する問題は、組み込みのメソッドを呼び出すと、カスタムのものではない通常のDataFrameを返します。 –

+0

だから、唯一の解決策は、組み込みのクラス自体を変更することです(私はやりたいとは思わない)。 – Ben

0

データフレームのインスタンスを作成すると、DataFrameオブジェクトになります。この方法で既存のメソッドをオーバーライドできます。____existingMethod____ 2番目の質問については、2つのデータフレームを渡す新しいクラスを作成することをお勧めします。この場合は、____init____メソッドを作成する必要があります

関連する問題