web-dev-qa-db-fra.com

Pandas: Diff de deux Dataframes

J'ai besoin de comparer deux images de taille différente, ligne par ligne, et d'imprimer des lignes qui ne correspondent pas. Prenons les deux suivants:

df1 = DataFrame({
'Buyer': ['Carl', 'Carl', 'Carl'],
'Quantity': [18, 3, 5, ]})

df2 = DataFrame({
'Buyer': ['Carl', 'Mark', 'Carl', 'Carl'],
'Quantity': [2, 1, 18, 5]})

Quel est le moyen le plus efficace de hiérarchiser sur df2 et d’imprimer des lignes qui ne sont pas dans df1, par exemple:

Buyer     Quantity 
Carl         2
Mark         1

Important: je ne veux pas avoir de rangée:

Buyer     Quantity 
Carl         3

inclus dans le diff:

J'ai déjà essayé: Comparer deux images de longueur différente, ligne par ligne, et ajouter des colonnes de valeur égale pour chaque ligne et Affichage de la différence entre deux images de données Pandas côte à côte - mise en évidence de la différence

Mais ceux-ci ne correspondent pas à mon problème.

Je vous remercie

Andy

27
Andy

merge les 2 dfs qui utilisent la méthode 'outer' et qui passent param indicator=True vous diront si les lignes sont présentes dans les deux/gauche uniquement/droite uniquement, vous pouvez alors filtrer le df fusionné après:

In [22]:
merged = df1.merge(df2, indicator=True, how='outer')
merged[merged['_merge'] == 'right_only']

Out[22]:
  Buyer  Quantity      _merge
3  Carl         2  right_only
4  Mark         1  right_only
70
EdChum
diff = set(Zip(df2.Buyer, df2.Quantity)) - set(Zip(df1.Buyer, df1.Quantity))

C'est la première solution qui m'est venue à l'esprit. Vous pouvez ensuite remettre le jeu de diff dans un DF pour présentation.

6
Shovalt

Essayez ce qui suit si vous souhaitez uniquement ajouter les nouveaux acheteurs à l'autre df:

df_delta=df2[df2['Buyer'].apply(lambda x: x not in df1['Buyer'].values)]
0
Yasir