J'ai besoin de vérifier les enregistrements qui changent d'un DataFrame à l'autre. Il doit correspondre sur toutes les colonnes.Pandas Vérification de l'égalité Trop lent pour l'utilisation
l'un est un fichier Excel (new_df
), l'un est une requête SQL (sql_df
). La forme est ~ 20 000 lignes par 39 colonnes. Je pensais que ce serait un bon travail pour df.equals(other_df)
Actuellement, je me sers de ce qui suit:
import pandas as pd
import numpy as np
new_df = pd.DataFrame({'ID' : [0 ,1, 2, 3, 4, 5, 6, 7, 8, 9],
'B' : [1,0,3,5,0,0,np.NaN,9,0,0],
'C' : [10,0,30,50,0,0,4,10,1,3],
'D' : [1,0,3,4,0,0,7,8,0,1],
'E' : ['Universtiy of New York','New Hampshire University','JMU','Oklahoma State','Penn State',
'New Mexico Univ','Rutgers','Indiana State','JMU','University of South Carolina']})
sql_df= pd.DataFrame({'ID' : [0 ,1, 2, 3, 4, 5, 6, 7, 8, 9],
'B' : [1,0,3,5,0,0,np.NaN,9,0,0],
'C' : [10,0,30,50,0,0,4,10,1,0],
'D' : [5,0,3,4,0,0,7,8,0,1],
'E' : ['Universtiy of New York','New Hampshire University','NYU','Oklahoma State','Penn State',
'New Mexico Univ','Rutgers','Indiana State','NYU','University of South Carolina']})
# creates an empty list to append to
differences = []
# for all the IDs in the dataframe that should not change check if this record is the same in the database
# must use reset_index() so the equals() will work as I expect it to
# if it is not the same, append to a list which has the Aspn ID that is failing, along with the columns that changed
for unique_id in new_df['ID'].tolist():
# get the id from the list, and filter both sql and new dfs to this record
if new_df.loc[new_df['ID'] == unique_id].reset_index(drop=True).equals(sql_df.loc[sql_df['ID'] == unique_id].reset_index(drop=True)) is False:
bad_columns = []
for column in new_df.columns.tolist():
# if not the same above, check which column using the same logic
if new_df.loc[new_df['ID'] == unique_id][column].reset_index(drop=True).equals(sql_df.loc[sql_df['ID'] == unique_id][column].reset_index(drop=True)) is False:
bad_columns.append(column)
differences.append([unique_id, bad_columns])
Je prends plus tard differences
et bad_columns
et d'autres tâches avec eux.
Il y a beaucoup de boucles que j'espère éviter ... comme ceci peut être la cause de mon problème de performance. Il prend actuellement plus de 5 minutes pour 20 000 enregistrements (varie selon le matériel), ce qui est une performance abyssale. Je pensais ajouter/concaténer toutes les colonnes dans une longue chaîne à comparer à la place, mais cela semble être un autre moyen inefficace. Quelle serait une meilleure façon de résoudre ceci/comment puis-je éviter ce désordre d'ajouter à une solution de liste vide?
Qu'est-ce qui vous fait penser que «l'égal» est le coupable? – user2357112
@ user2357112 - point valide. Pourrait * facilement * être le montant de la boucle - j'ai mis à jour le titre pour être moins trompeur à ce sujet – MattR
Un exemple de 'new_df' et' sql_df' (ou quelque chose de semblable) aiderait grandement à fournir une solution de travail. – FabienP