web-dev-qa-db-fra.com

Supprimer toutes les lignes en double dans Python Pandas

La fonction pandasdrop_duplicates est idéale pour "unifier" une trame de données. Cependant, l'un des arguments de mot clé à transmettre est take_last=True ou take_last=False, alors que je voudrais supprimer toutes les lignes qui sont en double dans un sous-ensemble de colonnes. Est-ce possible?

    A   B   C
0   foo 0   A
1   foo 1   A
2   foo 1   B
3   bar 1   A

Par exemple, j'aimerais supprimer les lignes qui correspondent aux colonnes A et C afin que les lignes 0 et 1 soient supprimées.

109
Jamie Bull

C’est beaucoup plus facile dans pandas avec maintenant drop_duplicates et le paramètre keep.

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.drop_duplicates(subset=['A', 'C'], keep=False)
175
Ben

Je veux juste ajouter à la réponse de Ben sur drop_duplicates :

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

  • first: supprime les doublons sauf pour la première occurrence.

  • last: supprime les doublons sauf pour la dernière occurrence.

  • False: Supprime tous les doublons.

Réglez donc keep sur False, nous vous donnons la réponse souhaitée.

DataFrame.drop_duplicates (* args, ** kwargs) Renvoie DataFrame avec les lignes en double supprimées, éventuellement en ne considérant que certaines colonnes.

Paramètres: subset: étiquette de colonne ou séquence d'étiquettes, facultatif Considérez uniquement certaines colonnes pour identifier les doublons. Par défaut, utilisez toutes les colonnes conservées: {'premier', 'dernier', Faux}, par défaut 'premier' en premier: Supprimer les doublons sauf pour la première fois. last: supprime les doublons sauf pour la dernière occurrence. False: Supprime tous les doublons. take_last: deprecated inplace: boolean, default False Indique s'il faut supprimer les doublons ou renvoyer une copie. cols: kwargs uniquement l'argument du sous-ensemble [deprecated] Renvoie: dédupliqué: DataFrame

36
Jake

Si vous souhaitez que le résultat soit stocké dans un autre jeu de données:

df.drop_duplicates(keep=False)

ou

df.drop_duplicates(keep=False, inplace=False)

Si le même jeu de données doit être mis à jour:

df.drop_duplicates(keep=False, inplace=True)

Les exemples ci-dessus vont supprimer tous les doublons et en conserver un, semblable à DISTINCT * en SQL

15
Ramanujam Allam

utilisez groupby et filter

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.groupby(["A", "C"]).filter(lambda df:df.shape[0] == 1)
10
HYRY

En fait, seules les lignes 0 et 1 sont supprimées (toutes les observations contenant les A et C appariés sont conservées):

In [335]:

df['AC']=df.A+df.C
In [336]:

print df.drop_duplicates('C', take_last=True) #this dataset is a special case, in general, one may need to first drop_duplicates by 'c' and then by 'a'.
     A  B  C    AC
2  foo  1  B  fooB
3  bar  1  A  barA

[2 rows x 4 columns]

Mais je soupçonne que ce que vous voulez vraiment est ceci (une observation contenant les A et C appariés est conservée):

In [337]:

print df.drop_duplicates('AC')
     A  B  C    AC
0  foo  0  A  fooA
2  foo  1  B  fooB
3  bar  1  A  barA

[3 rows x 4 columns]

Modifier:

Maintenant, c'est beaucoup plus clair, donc:

In [352]:
DG=df.groupby(['A', 'C'])   
print pd.concat([DG.get_group(item) for item, value in DG.groups.items() if len(value)==1])
     A  B  C
2  foo  1  B
3  bar  1  A

[2 rows x 3 columns]
4
CT Zhu