Eu tenho um conjunto de dados com 19 colunas e cerca de 250k linhas. Eu trabalhei com conjuntos de dados maiores, mas desta vez o Pandas decidiu brincar com meus nervos.
Tentei dividir o conjunto de dados original em 3 subframes com base em algumas regras simples. No entanto, leva muito tempo para executar o código. Cerca de 15 a 20 segundos apenas para a filtragem.
Alguma maneira alternativa de melhorar o desempenho do código?
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()
No final, eu tenho os df1, df2, df
quadros de dados com os dados filtrados.
fonte
Você cronometrou qual linha do seu código consome mais tempo? Eu suspeito que a linha
df = df[~df.isin(df1)].dropna()
levaria muito tempo. Seria mais rápido se você simplesmente usar a negação da condição que você aplicado para obterdf1
, quando você deseja filtrar afastado linhas emdf1
partirdf
?Ou seja, use
df = df[(df.col1 != 10) | (df.col2 > 15)]
.fonte
Além das sugestões nas outras respostas, ajuda se adicionarmos os campos de pesquisa ao índice DataFrame. Ref: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html
Os DataFrames do Pandas também suportam vários índices. Ref: https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html
Um exemplo pode ser encontrado aqui https://stackoverflow.com/a/58061800/2130670
fonte