5 votes

Comment déposer des lignes uniques dans un dataframe pandas ?

Je suis coincé avec un problème apparemment facile : laisser tomber les lignes uniques dans un cadre de données pandas. En gros, le contraire de drop_duplicates() .

Disons que ce sont mes données :

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

Je voudrais supprimer les lignes lorsque A, et B sont uniques, c'est-à-dire que je voudrais garder uniquement les lignes 1 et 2.

J'ai essayé ce qui suit :

# Load Dataframe
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})

uniques = df[['A', 'B']].drop_duplicates()
duplicates = df[~df.index.isin(uniques.index)]

Mais je n'obtiens que la ligne 2, car 0, 1 et 3 sont dans les uniques !

8voto

jezrael Points 290608

Solutions pour sélectionner toutes les lignes dupliquées :

Vous pouvez utiliser duplicated avec sous-ensemble et paramètre keep=False pour sélectionner tous les doublons :

df = df[df.duplicated(subset=['A','B'], keep=False)]
print (df)
     A  B  C
1  foo  1  A
2  foo  1  B

Solution avec transform :

df = df[df.groupby(['A', 'B'])['A'].transform('size') > 1]
print (df)
     A  B  C
1  foo  1  A
2  foo  1  B

Des solutions un peu modifiées pour sélectionner toutes les lignes uniques :

#invert boolean mask by ~
df = df[~df.duplicated(subset=['A','B'], keep=False)]
print (df)
     A  B  C
0  foo  0  A
3  bar  1  A

df = df[df.groupby(['A', 'B'])['A'].transform('size') == 1]
print (df)
     A  B  C
0  foo  0  A
3  bar  1  A

1voto

toto_tico Points 2014

J'ai trouvé une solution en utilisant groupby :

groupped = df.groupby(['A', 'B']).size().reset_index().rename(columns={0: 'count'})
uniques = groupped[groupped['count'] == 1]
duplicates = df[~df.index.isin(uniques.index)]

Duplicates a maintenant le bon résultat :

    A       B   C
2   foo     1   B
3   bar     1   A

De plus, ma tentative initiale dans la question peut être corrigée en ajoutant simplement keep=False dans le drop_duplicates méthode :

# Load Dataframe
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})

uniques = df[['A', 'B']].drop_duplicates(keep=False)
duplicates = df[~df.index.isin(uniques.index)]

Veuillez répondre à @jezrael, je pense que c'est le plus sûr ( ?), car j'utilise ici des index pandas.

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