Pandasデータフレームのフィルタリング速度を改善する


9

19列と約25万行のデータセットがあります。私はより大きなデータセットを扱ってきましたが、今度はパンダスが私の神経で遊ぶことにしました。

いくつかの単純なルールに基づいて、元のデータセットを3つのサブデータフレームに分割しようとしました。ただし、コードの実行には時間がかかります。フィルタリングのためだけに約15〜20秒。

コードのパフォーマンスを向上させる代替方法はありますか?

import pandas as pd

#read dataset
df = pd.read_csv('myData.csv')

#create a dataframe with col1 10 and col2 <= 15
df1 = df[(df.col1 == 10) & (df.col2 <= 15)]
df = df[~df.isin(df1)].dropna()

#create a dataframe with col3 7 and col4 >= 4
df2 = df[(df.col3 == 7) & (df.col4 >= 4)]
df = df[~df.isin(df2)].dropna()

最後にdf1, df2, df、フィルタリングされたデータを含むデータフレームがあります。

回答:


15

理解すべき概念は、条件は実際にはベクトルであるということです。したがって、単純に条件を定義してから、次のようにそれらを論理的に組み合わせることができます。

condition1 = (df.col1 == 10) & (df.col2 <= 15)
condition2 = (df.col3 == 7) & (df.col4 >= 4)

# at this point, condition1 and condition2 are vectors of bools

df1 = df[condition1]
df2 = df[condition2 & ~condition1]
df = df[~ (condition1 | condition2)]

これは条件式を1回しか評価しないため、かなり高速になります。次に、それらを使用してインデックス付きルックアップを実行し、新しいより小さなデータフレームを作成します。


NoneまたはNaNが存在する場合は、ブール論理がそれらで機能しない可能性があることに注意してください。
kawingkelvin

5

コードのどの行が最も時間がかかるかを計ったか?ラインdf = df[~df.isin(df1)].dropna()が長くかかると思います。あなたは単にあなたが得るために適用される条件の否定を使用する場合、それはより速くなりdf1ますが、内の行を離れてフィルタリングする際、df1からdf

つまり、を使用しますdf = df[(df.col1 != 10) | (df.col2 > 15)]


各行のタイミングを推奨する+1
kbrose '24

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.