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.

6voto

Nafeez Quraishi Points 1165

sort("ID") ne semble pas fonctionner maintenant, il semble être déprécié comme dans la section trier le document donc utiliser sort_values("ID") au lieu de trier après le filtre des doublons, comme suit :

df[df.ID.duplicated(keep=False)].sort_values("ID")

4voto

Oshbocker Points 41

En utilisant un ou logique par élément et en définissant l'argument take_last de la méthode pandas duplicated à la fois sur True et False, vous pouvez obtenir un ensemble à partir de votre cadre de données qui inclut tous les doublons.

df_bigdata_duplicates = 
    df_bigdata[df_bigdata.duplicated(cols='ID', take_last=False) |
               df_bigdata.duplicated(cols='ID', take_last=True)
              ]

4voto

yoonghm Points 1213

Il ne s'agit pas forcément d'une solution à la question, mais d'illustrer des exemples :

import pandas as pd

df = pd.DataFrame({
    'A': [1,1,3,4],
    'B': [2,2,5,6],
    'C': [3,4,7,6],
})

print(df)
df.duplicated(keep=False)
df.duplicated(['A','B'], keep=False)

Les résultats :

   A  B  C
0  1  2  3
1  1  2  4
2  3  5  7
3  4  6  6

0    False
1    False
2    False
3    False
dtype: bool

0     True
1     True
2    False
3    False
dtype: bool

4voto

LetzerWille Points 3393

Pour ma base de données, duplicated(keep=False) ne fonctionnait pas tant que la colonne n'était pas triée.

data.sort_values(by=['Order ID'], inplace=True)
df = data[data['Order ID'].duplicated(keep=False)]

3voto

PREM JILLA Points 31

Vous pourriez utiliser :

df[df.duplicated(['ID'])==True].sort_values('ID')

lignes dupliquées et leur index loc # pour toutes les valeurs de colonne

def dup_rows_index(df):
  dup = df[df.duplicated()]
  print('Duplicated index loc:',dup[dup == True ].index.tolist())
  return dup

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