2017-09-28 10 views
0

私は10000sの大きなデータフレームを持っており、そのサブセットを選択したいと考えています。私が使用しているのはは、Pythonでデータフレームのサブセットを選択するパフォーマンスを向上させます

newdf = df[[column for column in df if "exclude_me" is not in column]] 

ですが、これは計算に時間がかかります。それを行列に変換するかnumpyを使うなどのより速い回避策がありますか?

+2

これは本当に時間がかかりません。 –

+0

そして、 'pandas' **はすでに' numpy'をフードの下に使います。 –

+0

実際に私はその計算を停止しました。その470000列と70行は10000ではありません.... – horseshoe

答えて

0

興味深い、位置ILOCとインデックスではなく名前を使用して

newdf= df.iloc[:,[ind for ind,col in enumerate(df.columns) if "exclude_me" not in col]] 
はるかに高速です
0

これ以上の情報や実行するデータセットがなければ、問題が列名の収集に由来するものであろうと、DataFrameのスライスによるものであろうと推測されます。スライスはパンダで速くなければならないので、最初に列の計算を調べます。

これはあなたに同じ結果を与える必要がありますが、列の大規模な量のために速いかもしれません:

columns = list(val for val in my_dataframe.columns.values if "exclude_me" is not in val) newdf = df[columns]

+0

Huh?なぜ、リスト内のジェネレータ式をラップするのがリスト内包より速いのですか? –

+0

私もこれをスライスしてみました...私は1つのコラムを削除しても、それは永遠にかかります。 Deepcopyはうまく動作します – horseshoe

+0

@ juanpa.arrivillaga私のアプローチのOPとの違いは、データフレーム自体を反復するのではなく、dataframe.columns.valuesを反復処理することです。もちろん、リストの理解を使用することもできます(または、データフレームにジェネレータを渡すこともできますが、パンダがそれを処理できるかどうかはわかりません)。 – MrTrustworthy

関連する問題