私は10000sの大きなデータフレームを持っており、そのサブセットを選択したいと考えています。私が使用しているのはは、Pythonでデータフレームのサブセットを選択するパフォーマンスを向上させます
newdf = df[[column for column in df if "exclude_me" is not in column]]
ですが、これは計算に時間がかかります。それを行列に変換するかnumpyを使うなどのより速い回避策がありますか?
私は10000sの大きなデータフレームを持っており、そのサブセットを選択したいと考えています。私が使用しているのはは、Pythonでデータフレームのサブセットを選択するパフォーマンスを向上させます
newdf = df[[column for column in df if "exclude_me" is not in column]]
ですが、これは計算に時間がかかります。それを行列に変換するかnumpyを使うなどのより速い回避策がありますか?
興味深い、位置ILOCとインデックスではなく名前を使用して
newdf= df.iloc[:,[ind for ind,col in enumerate(df.columns) if "exclude_me" not in col]]
はるかに高速です
これ以上の情報や実行するデータセットがなければ、問題が列名の収集に由来するものであろうと、DataFrameのスライスによるものであろうと推測されます。スライスはパンダで速くなければならないので、最初に列の計算を調べます。
これはあなたに同じ結果を与える必要がありますが、列の大規模な量のために速いかもしれません:
columns = list(val for val in my_dataframe.columns.values if "exclude_me" is not in val) newdf = df[columns]
Huh?なぜ、リスト内のジェネレータ式をラップするのがリスト内包より速いのですか? –
私もこれをスライスしてみました...私は1つのコラムを削除しても、それは永遠にかかります。 Deepcopyはうまく動作します – horseshoe
@ juanpa.arrivillaga私のアプローチのOPとの違いは、データフレーム自体を反復するのではなく、dataframe.columns.valuesを反復処理することです。もちろん、リストの理解を使用することもできます(または、データフレームにジェネレータを渡すこともできますが、パンダがそれを処理できるかどうかはわかりません)。 – MrTrustworthy
これは本当に時間がかかりません。 –
そして、 'pandas' **はすでに' numpy'をフードの下に使います。 –
実際に私はその計算を停止しました。その470000列と70行は10000ではありません.... – horseshoe