2016-02-11 1 views
2

J'ai 2 trames de données non indexées, avec la même structure de données exactes (mêmes colonnes), pour des raisons de simplicité, voici un exemple:pandas géants: différence de données (delta) entre 2 trames de données

DF1

0  1  2   3 4 
JoeK Joe  Kavanagh 120 [email protected] 
BarryD Barry Dempsy  11 [email protected] 
OrlaF Orla Farrel  236 [email protected] 
SethB Seth Black  563 [email protected] 
KateW Kate White  254 [email protected] 

et le second:

DF2

0  1  2   3 4 
JoeK Joe  Kavanagh 110 [email protected] 
BarryD Barry Dempsy  11 [email protected] 
JimmyS Jimmy Smith  250 [email protected] 
SethB Seth Blake  563 [email protected] 

Je voudrais avoir un résu lting dataframes représentant les lignes de DF1 qui ne sont pas en DF2:

0  1  2   3 4 
JoeK Joe  Kavanagh 120 [email protected] 
OrlaF Orla Farrel  236 [email protected] 
SethB Seth Black  563 [email protected] 
KateW Kate White  254 [email protected] 

Notez que la première rangée (Joek et SethB) existent dans les deux dataframes, mais la valeur de la colonne 3 pour JoeK et la valeur de la colonne 2 pour SethB ont changé, c'est pourquoi ils sont dans le résultat final.

Toute aide est très appréciée.

+0

Votre résultat ne devrait-il pas être juste 'df1' parce que les emails ne correspondent pas pour la deuxième rangée? Ou est-ce que votre restriction correspond juste aux cols 0-3? – EdChum

+0

Bien repéré, c'était une faute de frappe. Je l'ai corrigé maintenant. –

Répondre

1

IIUC On dirait que vous essayez juste de faire correspondre sur les cols 0,1,2,3, vous pouvez effectuer une gauche merge et passer le paramètre indicator=True si vous utilisez une version récente des pandas, puis filtrer la df :

In [197]: 
merged = df1.merge(df2, how='left', on=['0','1','2','3'],indicator=True) 
merged[merged['_merge'] == 'left_only'] 

Out[197]: 
     0  1   2 3      4_x 4_y  _merge 
0 JoeK Joe Kavanagh 120 [email protected] NaN left_only 
2 OrlaF Orla Farrel 236   [email protected] NaN left_only 
3 SethB Seth  Black 563  [email protected] NaN left_only 
4 KateW Kate  White 254   [email protected] NaN left_only 
+0

J'essaie de faire correspondre toutes les colonnes ici. c'était un échantillon, la base de données que j'ai a plus de 60 colonnes. J'utiliserai donc = = df1.columns.tolist() –

+0

Par défaut, il va correspondre sur toutes les colonnes, donc dans votre cas, vous ne devriez pas avoir besoin de passer les valeurs param 'on', sauf si vous avez une autre exigence – EdChum

+0

Cela devrait fonctionner' fusionné = df1.merge (df2, how = 'left', indicateur = True) 'Je pense, vous pouvez aussi upvote – EdChum