Cải thiện tốc độ lọc dữ liệu của Pandas


9

Tôi có một bộ dữ liệu với 19 cột và khoảng 250k hàng. Tôi đã làm việc với các bộ dữ liệu lớn hơn, nhưng lần này, Pandas quyết định chơi với thần kinh của tôi.

Tôi đã cố gắng chia dữ liệu gốc thành 3 datafram dựa trên một số quy tắc đơn giản. Tuy nhiên, phải mất một thời gian dài để thực thi mã. Khoảng 15-20 giây chỉ để lọc.

Bất kỳ cách nào khác sẽ cải thiện hiệu suất của mã?

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

Cuối cùng, tôi có các df1, df2, dfdataframes với dữ liệu được lọc.

Câu trả lời:


15

Khái niệm cần hiểu là điều kiện thực sự là một vectơ. Vì vậy, bạn có thể chỉ cần xác định các điều kiện và sau đó kết hợp chúng một cách hợp lý, như:

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

Điều này sẽ nhanh hơn đáng kể vì nó chỉ đánh giá điều kiện một lần. Sau đó, nó sử dụng chúng để thực hiện tra cứu được lập chỉ mục để tạo các tệp dữ liệu mới nhỏ hơn.


Trong trường hợp có sự hiện diện của Không hoặc NaN, chỉ cần lưu ý rằng logic boolean có thể không hoạt động trên chúng.
kawingkelvin

5

Bạn đã tính thời gian mà dòng mã của bạn tốn nhiều thời gian nhất chưa? Tôi nghi ngờ rằng dòng df = df[~df.isin(df1)].dropna()sẽ mất một thời gian dài. Nó sẽ nhanh hơn nếu bạn chỉ cần sử dụng sự phủ định của các điều kiện bạn áp dụng để có được df1, khi bạn muốn lọc ra các hàng trong df1từ df?

Đó là, sử dụng df = df[(df.col1 != 10) | (df.col2 > 15)].


+1 để đề xuất thời gian cho mỗi dòng
kbrose

0

Ngoài các đề xuất trong các câu trả lời khác, sẽ rất hữu ích nếu chúng ta thêm các trường tìm kiếm vào chỉ mục DataFrame. Tham chiếu: https://pandas.pydata.org/pandas-docs/ sóng / user_guide / index.html

Pandas DataFrames cũng hỗ trợ đa chỉ mục. Tham chiếu: https://pandas.pydata.org/pandas-docs/ sóng / user_guide / adv cân.html

Một ví dụ có thể được tìm thấy ở đây https://stackoverflow.com/a/58061800/2130670

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.