2 votes

Trouver des doublons dans le dataframe selon des critères composites?

Je dispose d'un dataframe qui contient des données comme suit :

col1    col2    col3
1       3       bob
2       1       alice
3       3       bob
4       3       rose

Et ce que je veux faire, c'est conserver les lignes dupliquées de col2 et écarter les doublons avec plus d'une occurrence de la valeur de col3. Ou en d'autres termes, des doublons de col2 mais seulement là où les valeurs de col3 sont différentes. Ainsi, dans l'exemple ci-dessus, j'obtiendrais :

col1    col2    col3
1       3       bob
4       3       rose

Alice ne serait pas dans le résultat parce qu'évidemment, il n'y a pas de deuxième valeur du '1' de col2 - ce n'est pas un doublon. La deuxième entrée de Bob (3 3 bob) ne serait pas dans le résultat car même si le '3' de col2 est un doublon, le 'bob' de col3 est déjà dans l'ensemble de résultats (1 3 bob). (Je suis conscient du paramètre keep= pour changer le comportement de la conservation du premier ou du dernier, mais je l'ignore pour des raisons de simplicité.)

Des idées? Merci.

1voto

wwnde Points 14457

Utilisez une combinaison de .duplicated(), .drop_duplicates() et l'accessor loc

df.loc[df[df['col2'].duplicated(False)].col3.drop_duplicates(keep='first').index,:]

 col1  col2  col3
0     1     3   bob
3     4     3  rose

Comment cela fonctionne

#Filtrer tous les doublons dans col2 en utilisant duplicated(False)

df[df['col2'].duplicated(False)]

#Supprimer les doublons dans col3 en conservant le premier en utilisant .drop_duplicates(keep='first')

df[df['col2'].duplicated(False)].col3.drop_duplicates(keep='first')

#Extraire l'index

df[df['col2'].duplicated(False)].col3.drop_duplicates(keep='first').index

#Enfin filtrer en utilisant l'accessor loc
     df.loc[index, toutes les colonnes]

1voto

Scott Boston Points 48995

Essayer:

df.loc[df.drop_duplicates(['col2', 'col3'])
         .duplicated(['col2'], keep=False).loc[lambda x: x].index]

Sortie:

   col1  col2  col3
0     1     3   bob
3     4     3  rose

Détails:

A l'intérieur de df.loc trouver les index en utilisant

  • premièrement drop_duplicates pour se débarrasser des enregistrements dupliqués de col2 et col3

  • utiliser duplicated avec keep = False pour retourner True pour tous les enregistrements avec 'col2' dupliqué

  • enfin, utiliser loc avec lambda pour sélectionner uniquement les index True

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X