web-dev-qa-db-fra.com

Comment compter les lignes en double dans la base de données pandas?

J'essaie de compter les doublons de chaque type de ligne dans mon cadre de données. Par exemple, supposons que j'ai une base de données dans les pandas comme suit:

df = pd.DataFrame({'one': pd.Series([1., 1, 1]),
                   'two': pd.Series([1., 2., 1])})

Je reçois un df qui ressemble à ceci:

    one two
0   1   1
1   1   2
2   1   1

J'imagine que la première étape consiste à trouver toutes les différentes lignes uniques, ce que je fais en:

df.drop_duplicates()

Cela me donne le df suivant:

    one two
0   1   1
1   1   2

Maintenant, je veux prendre chaque ligne de la df ci-dessus ([1 1] et [1 2]) et obtenir un compte du nombre de fois que chacune d'entre elles est dans la df initiale. Mon résultat ressemblerait à quelque chose comme ça:

Row     Count
[1 1]     2
[1 2]     1

Comment dois-je faire pour faire cette dernière étape?

Modifier:

Voici un exemple plus large pour le rendre plus clair:

df = pd.DataFrame({'one': pd.Series([True, True, True, False]),
                   'two': pd.Series([True, False, False, True]),
                   'three': pd.Series([True, False, False, False])})

donne moi:

    one three   two
0   True    True    True
1   True    False   False
2   True    False   False
3   False   False   True

Je veux un résultat qui me dit:

       Row           Count
[True True True]       1
[True False False]     2
[False False True]     1
26
jss367

Vous pouvez groupby sur toutes les colonnes et appeler size l'index indique les valeurs en double:

In [28]:
df.groupby(df.columns.tolist(),as_index=False).size()

Out[28]:
one    three  two  
False  False  True     1
True   False  False    2
       True   True     1
dtype: int64
31
EdChum
df.groupby(df.columns.tolist()).size().reset_index().\
    rename(columns={0:'records'})

   one  two  records
0    1    1        2
1    1    2        1
14
Denis

Si vous souhaitez compter les doublons sur une ou plusieurs colonnes: 

len(df['one'])-len(df['one'].drop_duplicates())

Si vous souhaitez compter les doublons sur l’ensemble de la trame de données: 

len(df)-len(df.drop_duplicates())

Ou vous pouvez simplement utiliser DataFrame.duplicated (sous-ensemble = Aucun, garder = 'premier') :

df.duplicated(subset='one', keep='first').sum()

où 

sous-ensemble: étiquette de colonne ou séquence d'étiquettes (par défaut, utilisez toutes les colonnes)

keep: {‘premier’, ‘dernier’, Faux}, par défaut ‘premier’

  • premier: Marque les doublons comme étant vrais, sauf pour la première occurrence.
  • last: Marquer les doublons comme étant True, sauf pour la dernière occurrence.
  • False: Marque tous les doublons comme étant vrais.
3
Arash

Aucune des réponses existantes n'offre une solution simple qui renvoie "le nombre de lignes qui sont simplement des doublons et qui doivent être supprimées". Il s’agit d’une solution universelle qui:

# generate a table of those culprit rows which are duplicated:
dups = df.groupby(df.columns.tolist()).size().reset_index().rename(columns={0:'count'})

# sum the final col of that table, and subtract the number of culprits:
dups['count'].sum() - dups.shape[0]
0
olisteadman