[Pandas speedup] Si vous pensez que la fusion est lente, utilisez la carte

la fusion est lente!

Vous ne vous sentez pas? Surtout quand il y a beaucoup de lignes dans la compétition ou que c'est vraiment lent. Combien de temps passez-vous à créer des fonctionnalités! Dans un tel cas, l'utilisation de la carte le rendra plus rapide.

Exemple

S'il n'y a pas de numéro de ligne tel qu'il est, il n'y aura pas de différence, donc cette fois j'utiliserai le Titanic de Kaggle. Il y a une colonne appelée Age dedans, donc je veux compter l'encoder.

merge_map.py


import pandas as pd
import time

df = pd.read_csv("train.csv")
df["Age"] = df["Age"].dtype("str")
t1 = time.time()

#pettern 1
df = pd.merge(df,df.Age.value_counts().reset_index().rename(columns = {"Age":"Age_count1"}),
                         left_on = "Age", right_on = "index", how = "left")
t2 = time.time()

#pettern 2
df["Age_count2"] = df["Age"].map(df.Age.value_counts())
t3  =time.time()

print(t2-t1)
print(t3-t2)
#output
0.004603147506713867                                                                                                                                                                                                                        
0.0012080669403076172

Dans ce cas, la carte est 4 fois plus rapide. Vous pouvez également effectuer un encodage cible avec map.

df = pd.merge(df, df.groupby("Age").Survived.mean().reset_index().rename(columns = 
                    {"Survived":"Age_target1"}), on = "Age", how = "left")
t4 = time.time()
df["Age_target2"] = df["Age"].map(df.groupby(["Age"]).Survived.mean())
print(t4-t3)
print(t5-t4)
#output
0.005101919174194336                                                                                                                                                                                                                        
0.001428842544555664

C'est également environ quatre fois plus rapide. À cette échelle, c'est encore 10 ou 40 secondes. C'est assez différent quand vous comprenez 1 minute ou 4 minutes.

Si vous avez deux clés

la carte doit avoir une clé. Dans ce cas, créez une clé de force.

df = pd.merge(df, df.assign(sex_age_count = 0).groupby(
["Sex", "Age"])["sex_age_count"].count().reset_index(),on = ["Sex", "Age"] ,how = "left")

t6 = time.time()
#Faire une clé de force
df["Sex_Age"] = df["Sex"] + df["Age"]
t7 = time.time()
df["Sex_Age_count"] = df["Sex_Age"].map(df["Sex_Age"].value_counts())
t8 = time.time()

print(t6-t5)
print(t8-t7)

C'est également environ quatre fois plus rapide.

#output
0.006415843963623047                                                                                                                                                                                                                        
0.0015180110931396484    

Recommended Posts

[Pandas speedup] Si vous pensez que la fusion est lente, utilisez la carte
pandas idxmax est lent
Si vous obtenez une erreur: ce port est déjà utilisé. Dans Django
Pourquoi utiliser Pandas Apply ()
Si vous souhaitez utiliser NumPy, Pandas, Matplotlib, IPython, SciPy sous Windows
Si vous utilisez la fonction de tracé de Pandas en Python, elle est vraiment transparente du traitement des données à la création de graphiques
[Pandas] Qu'est-ce que set_option [Comment utiliser]
Si vous pensez que l'environnement PyCharm est cassé, c'est à cause du nom du fichier