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
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
df.groupby(df.columns.tolist()).size().reset_index().\
rename(columns={0:'records'})
one two records
0 1 1 2
1 1 2 1
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’
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]