[python] Comparaison de deux cadres de données sur les pandas pour les différences


Answers

Vous ne savez pas si cela existait au moment où la question a été publiée, mais les pandas ont maintenant une fonction intégrée pour tester l'égalité entre deux cadres de données: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.equals.html .

Question

J'ai un script mettant à jour 5-10 colonnes de données, mais parfois le csv de démarrage sera identique à la fin de la csv donc au lieu d'écrire un csvfile identique, je veux qu'il ne fasse rien ...

Comment puis-je comparer deux cadres de données pour vérifier s'ils sont identiques ou non?

csvdata = pandas.read_csv('csvfile.csv')
csvdata_old = csvdata

# ... do stuff with csvdata dataframe

if csvdata_old != csvdata:
    csvdata.to_csv('csvfile.csv', index=False)

Des idées?




Je ne suis pas sûr que cela soit utile ou non, mais j'ai assemblé cette méthode python rapide pour ne renvoyer que les différences entre deux dataframes qui ont les mêmes colonnes et la même forme.

def get_different_rows(source_df, new_df):
    """Returns just the rows from the new dataframe that differ from the source dataframe"""
    merged_df = source_df.merge(new_df, indicator=True, how='outer')
    changed_rows_df = merged_df[merged_df['_merge'] == 'right_only']
    return changed_rows_df.drop('_merge', axis=1)



Cela compare les valeurs de deux dataframes note le nombre de lignes / colonnes doit être identique entre les tables

comparison_array = table.values == expected_table.values
print (comparison_array)

>>>[[True, True, True]
    [True, False, True]]

if False in comparison_array:
    print ("Not the same")

#Return the position of the False values
np.where(comparison_array==False)

>>>(array([1]), array([1]))

Vous pouvez ensuite utiliser ces informations d'index pour renvoyer la valeur qui ne correspond pas entre les tables. Comme il est indexé à zéro, il se réfère au 2e tableau de la 2ème position qui est correct.




Links