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
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
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.
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)]