Réponse acceptée La méthode 1 ne fonctionnera pas pour les cadres de données contenant des NaNs, car pd.np.nan != pd.np.nan
. Je ne suis pas sûr que ce soit le meilleur moyen, mais on peut l'éviter en
df1[~df1.astype(str).apply(tuple, 1).isin(df2.astype(str).apply(tuple, 1))]
Il est plus lent, car il doit convertir les données en chaîne de caractères, mais grâce à cette conversion, il est possible d'obtenir des résultats plus rapides. pd.np.nan == pd.np.nan
.
Passons en revue le code. D'abord, nous convertissons les valeurs en chaînes de caractères, et nous appliquons tuple
à chaque ligne.
df1.astype(str).apply(tuple, 1)
df2.astype(str).apply(tuple, 1)
Grâce à cela, nous obtenons pd.Series
objet avec une liste de tuples. Chaque tuple contient une ligne entière de df1
/ df2
. Ensuite, nous appliquons isin
méthode sur df1
pour vérifier si chaque tuple "est dans" df2
. Le résultat est pd.Series
avec des valeurs booléennes. Vrai si le tuple de df1
est en df2
. Au final, nous annulons les résultats avec ~
et en appliquant un filtre sur df1
. Pour faire court, nous ne récupérons que les rangées provenant de df1
qui ne sont pas dans df2
.
Pour le rendre plus lisible, nous pouvons l'écrire comme suit :
df1_str_tuples = df1.astype(str).apply(tuple, 1)
df2_str_tuples = df2.astype(str).apply(tuple, 1)
df1_values_in_df2_filter = df1_str_tuples.isin(df2_str_tuples)
df1_values_not_in_df2 = df1[~df1_values_in_df2_filter]
5 votes
La manière la plus simple de le faire dépendra de la façon dont vos cadres de données sont structurés (c'est-à-dire si les index peuvent être utilisés, etc.). C'est un bon exemple de la raison pour laquelle vous devriez toujours inclure une balise exemple reproductible dans les questions des pandas.
1 votes
J'ai ajouté l'image d'exemple de dataframe
0 votes
Similaire à stackoverflow.com/q/20225110