Si j'ai deux blocs de données pour un exemple:
df1:
x y 0 1.1 2.1 1 3.1. 5.1 2 0.0 2.2 3 3.0 6.6 4 0.2 8.8
df2:
x y 0 0.0 2.2 1 1.1 2.1 2 3.0. 6.6 3 3.1 5.1 4 0.2 8.8
et je veux que df2 corresponde à l'ordre qui correspond aux valeurs communes mais en conservant les valeurs qui ne correspondent pas après la commande, comment ferais-je cela en utilisant des pandas? ou peut-être autre chose.
résultat souhaité:
new_df:
x y 0 1.1. 2.1 1 3.1 5.1
lignes 2-4 Je me fiche de la order tant que les lignes correspondantes suivent le même ordre que df1. Je veux que les valeurs des index de df1 et df2 soient égales
de quelque manière que ce soit?
désolé si la façon dont j'ai soumis cela est incorrecte.
merci les gars
3 Réponses :
Il suffit d'utiliser merge avec indicateur pour trier par défaut
df1.merge(df2,indicator=True,how='right')
Out[354]:
x y _merge
0 1.1 2.1 both
1 3.1 5.1 both
2 0.0 2.2 right_only
3 3.0 6.6 right_only
4 0.2 8.8 right_only
le seul problème avec ceci est qu'il ajoute une ligne supplémentaire à la fin pour une raison inconnue. Aucune suggestion?
@BVOM vous devez vérifier le doublon si vous df2 et df1 à vos côtés avez une ligne en double
Regardez les méthodes .combine_first et .update.
df1.combine_first(df2)
Elles sont expliquées dans le documentation ici .
Cela recrée la ligne par index ... il a besoin de la correspondance de valeur, vérifiez votre sortie, vous avez une ligne en double pour 3.1, 5.1
Utilisez pd.concat avec drop_duplicates:
x y 0 1.1 2.1 1 3.1 5.1 2 0.0 2.2 3 3.0 6.6 4 0.2 8.8
Output:
pd.concat([df1,df2]).drop_duplicates().reset_index(drop=True)