260 votes

Comment obtenir une liste de tous les éléments en double en utilisant pandas en python ?

J'ai une liste d'articles qui ont probablement des problèmes d'exportation. J'aimerais obtenir une liste des éléments en double afin de pouvoir les comparer manuellement. Lorsque j'essaie d'utiliser pandas méthode dupliquée il ne renvoie que le premier doublon. Existe-t-il un moyen d'obtenir tous les doublons et pas seulement le premier ?

Une petite sous-section de mon ensemble de données ressemble à ceci :

ID,ENROLLMENT_DATE,TRAINER_MANAGING,TRAINER_OPERATOR,FIRST_VISIT_DATE
1536D,12-Feb-12,"06DA1B3-Lebanon NH",,15-Feb-12
F15D,18-May-12,"06405B2-Lebanon NH",,25-Jul-12
8096,8-Aug-12,"0643D38-Hanover NH","0643D38-Hanover NH",25-Jun-12
A036,1-Apr-12,"06CB8CF-Hanover NH","06CB8CF-Hanover NH",9-Aug-12
8944,19-Feb-12,"06D26AD-Hanover NH",,4-Feb-12
1004E,8-Jun-12,"06388B2-Lebanon NH",,24-Dec-11
11795,3-Jul-12,"0649597-White River VT","0649597-White River VT",30-Mar-12
30D7,11-Nov-12,"06D95A3-Hanover NH","06D95A3-Hanover NH",30-Nov-11
3AE2,21-Feb-12,"06405B2-Lebanon NH",,26-Oct-12
B0FE,17-Feb-12,"06D1B9D-Hartland VT",,16-Feb-12
127A1,11-Dec-11,"064456E-Hanover NH","064456E-Hanover NH",11-Nov-12
161FF,20-Feb-12,"0643D38-Hanover NH","0643D38-Hanover NH",3-Jul-12
A036,30-Nov-11,"063B208-Randolph VT","063B208-Randolph VT",
475B,25-Sep-12,"06D26AD-Hanover NH",,5-Nov-12
151A3,7-Mar-12,"06388B2-Lebanon NH",,16-Nov-12
CA62,3-Jan-12,,,
D31B,18-Dec-11,"06405B2-Lebanon NH",,9-Jan-12
20F5,8-Jul-12,"0669C50-Randolph VT",,3-Feb-12
8096,19-Dec-11,"0649597-White River VT","0649597-White River VT",9-Apr-12
14E48,1-Aug-12,"06D3206-Hanover NH",,
177F8,20-Aug-12,"063B208-Randolph VT","063B208-Randolph VT",5-May-12
553E,11-Oct-12,"06D95A3-Hanover NH","06D95A3-Hanover NH",8-Mar-12
12D5F,18-Jul-12,"0649597-White River VT","0649597-White River VT",2-Nov-12
C6DC,13-Apr-12,"06388B2-Lebanon NH",,
11795,27-Feb-12,"0643D38-Hanover NH","0643D38-Hanover NH",19-Jun-12
17B43,11-Aug-12,,,22-Oct-12
A036,11-Aug-12,"06D3206-Hanover NH",,19-Jun-12

Mon code ressemble à ceci actuellement :

df_bigdata_duplicates = df_bigdata[df_bigdata.duplicated(cols='ID')]

Il y a quelques éléments en double. Mais, lorsque j'utilise le code ci-dessus, je n'obtiens que le premier élément. Dans la référence API, je vois comment je peux obtenir le dernier élément, mais j'aimerais les avoir tous afin de pouvoir les inspecter visuellement pour voir pourquoi j'obtiens cette divergence. Ainsi, dans cet exemple, j'aimerais obtenir les trois entrées A036 et les deux entrées 11795, ainsi que toute autre entrée dupliquée, au lieu de la seule première. Toute aide est la bienvenue.

275voto

DSM Points 71975

Méthode #1 : imprimer toutes les lignes où l'ID est l'un des ID en double :

>>> import pandas as pd
>>> df = pd.read_csv("dup.csv")
>>> ids = df["ID"]
>>> df[ids.isin(ids[ids.duplicated()])].sort_values("ID")
       ID ENROLLMENT_DATE        TRAINER_MANAGING        TRAINER_OPERATOR FIRST_VISIT_DATE
24  11795       27-Feb-12      0643D38-Hanover NH      0643D38-Hanover NH        19-Jun-12
6   11795        3-Jul-12  0649597-White River VT  0649597-White River VT        30-Mar-12
18   8096       19-Dec-11  0649597-White River VT  0649597-White River VT         9-Apr-12
2    8096        8-Aug-12      0643D38-Hanover NH      0643D38-Hanover NH        25-Jun-12
12   A036       30-Nov-11     063B208-Randolph VT     063B208-Randolph VT              NaN
3    A036        1-Apr-12      06CB8CF-Hanover NH      06CB8CF-Hanover NH         9-Aug-12
26   A036       11-Aug-12      06D3206-Hanover NH                     NaN        19-Jun-12

mais je n'ai pas trouvé de moyen agréable d'éviter de répéter ids tant de fois. Je préfère la méthode n°2 : groupby sur l'ID.

>>> pd.concat(g for _, g in df.groupby("ID") if len(g) > 1)
       ID ENROLLMENT_DATE        TRAINER_MANAGING        TRAINER_OPERATOR FIRST_VISIT_DATE
6   11795        3-Jul-12  0649597-White River VT  0649597-White River VT        30-Mar-12
24  11795       27-Feb-12      0643D38-Hanover NH      0643D38-Hanover NH        19-Jun-12
2    8096        8-Aug-12      0643D38-Hanover NH      0643D38-Hanover NH        25-Jun-12
18   8096       19-Dec-11  0649597-White River VT  0649597-White River VT         9-Apr-12
3    A036        1-Apr-12      06CB8CF-Hanover NH      06CB8CF-Hanover NH         9-Aug-12
12   A036       30-Nov-11     063B208-Randolph VT     063B208-Randolph VT              NaN
26   A036       11-Aug-12      06D3206-Hanover NH                     NaN        19-Jun-12

242voto

user666 Points 1650

Avec la version 0.17 de Pandas, vous pouvez définir l'option "keep = False" dans le fichier de configuration de Pandas. dupliqué pour récupérer tous les éléments en double.

In [1]: import pandas as pd

In [2]: df = pd.DataFrame(['a','b','c','d','a','b'])

In [3]: df
Out[3]: 
       0
    0  a
    1  b
    2  c
    3  d
    4  a
    5  b

In [4]: df[df.duplicated(keep=False)]
Out[4]: 
       0
    0  a
    1  b
    4  a
    5  b

224voto

Kelly ChowChow Points 1947
df[df.duplicated(['ID'], keep=False)]

il vous renverra toutes les lignes dupliquées.

Selon documentation :

keep : {'first', 'last', False}, par défaut 'first'.

  • first : Marquer les doublons comme Vrai sauf pour la première occurrence.
  • last : Marquer les doublons comme Vrai sauf pour la dernière occurrence.
  • Faux : Marquer tous les doublons comme Vrai.

26voto

Deepak Points 517

Comme je ne suis pas en mesure de commenter, je posterai donc une réponse séparée.

Pour trouver les doublons sur la base de plusieurs colonnes, mentionnez le nom de chaque colonne. comme ci-dessous, et vous obtiendrez tous les ensembles de lignes dupliquées :

df[df[['product_uid', 'product_title', 'user']].duplicated() == True]

Alternativement,

df[df[['product_uid', 'product_title', 'user']].duplicated()]

16voto

Hariprasad Points 333
df[df['ID'].duplicated() == True]

Cela a fonctionné pour moi

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