Meningkatkan kecepatan penyaringan dataframe Pandas

9

Saya memiliki dataset dengan 19 kolom dan sekitar 250rb baris. Saya telah bekerja dengan kumpulan data yang lebih besar, tetapi kali ini, Pandas memutuskan untuk bermain dengan saraf saya.

Saya mencoba untuk membagi dataset asli menjadi 3 sub-dataframe berdasarkan beberapa aturan sederhana. Namun, butuh waktu lama untuk mengeksekusi kode. Sekitar 15-20 detik hanya untuk penyaringan.

Adakah cara alternatif yang akan meningkatkan kinerja kode?

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()

Pada akhirnya, saya memiliki df1, df2, dfdataframe dengan data yang difilter.

Tasos
sumber

Jawaban:

15

Konsep yang harus dipahami adalah syaratnya sebenarnya adalah vektor. Jadi, Anda bisa mendefinisikan kondisi, dan kemudian menggabungkannya secara logis, seperti:

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)]

Ini akan jauh lebih cepat karena hanya mengevaluasi satu kali bersyarat. Kemudian menggunakannya untuk melakukan pencarian indeks untuk membuat kerangka data baru yang lebih kecil.

Stephen Rauch
sumber
Jika ada None atau NaN, berhati-hatilah karena logika boolean mungkin tidak berfungsi.
kawingkelvin
5

Sudahkah Anda menghitung waktu baris kode mana yang paling memakan waktu? Saya curiga bahwa df = df[~df.isin(df1)].dropna()sambungan itu akan memakan waktu lama. Apakah akan lebih cepat jika Anda hanya menggunakan negasi dari kondisi yang Anda terapkan untuk memperoleh df1, ketika Anda ingin menyaring baris df1dari df?

Yaitu, gunakan df = df[(df.col1 != 10) | (df.col2 > 15)].

Albert
sumber
+1 untuk merekomendasikan pengaturan waktu setiap baris
kbrose