Python( pandas): suppression des doublons basés sur deux colonnes gardant la ligne avec la valeur max dans une autre colonne

j'ai une base de données qui contient des valeurs de duplicata selon deux colonnes (A et B):

A B C
1 2 1
1 2 4
2 7 1
3 4 0
3 4 8

je veux supprimer les doublons de garder la ligne avec la valeur max dans la colonne C. Cela donnerait:

A B C
1 2 4
2 7 1
3 4 8

je ne peux pas comprendre comment le faire. Dois-je utiliser drop_duplicates(), quelque chose d'autre?

27
demandé sur Elsalex 2015-08-19 14:10:04

4 réponses

Vous pouvez le faire en utilisant le groupe de par:

c_maxes = df.groupby(['A', 'B']).C.transform(max)
df = df.loc[df.C == c_maxes]

c_maxes est un Series des valeurs maximales de C dans chaque groupe, mais qui est de la même longueur et le même indice df. Si vous n'avez pas utilisé .transform impression c_maxes pourrait être une bonne idée de voir comment cela fonctionne.

une autre approche utilisant drop_duplicates

df.sort('C').drop_duplicates(subset=['A', 'B'], take_last=True)

Je ne suis pas sûr de savoir ce qui est le plus efficace, mais je suppose que la première approche parce qu'elle n'implique pas le tri.

modifier: À partir de pandas 0.18 la deuxième solution serait df.sort_values('C').drop_duplicates(subset=['A', 'B'], keep='last') ou, alternativement, df.sort_values('C', ascending=False).drop_duplicates(subset=['A', 'B']). En tout cas, le groupby la solution semble être nettement plus performante:

%timeit -n 10 df.loc[df.groupby(['A', 'B']).C.max == df.C]
10 loops, best of 3: 25.7 ms per loop

%timeit -n 10 df.sort_values('C').drop_duplicates(subset=['A', 'B'], keep='last')
10 loops, best of 3: 101 ms per loop
37
répondu JoeCondron 2018-01-08 17:22:37

je pense que groupby devrait travailler.

df.groupby(['A', 'B']).max()['C']

si vous avez besoin d'un retour de dataframe, vous pouvez enchaîner l'appel d'index reset.

df.groupby(['A', 'B']).max()['C'].reset_index()
7
répondu b10n 2015-08-19 11:39:42

Vous pouvez faire ceci simplement en utilisant la fonction pandas drop duplicates

df.drop_duplicates(['A','B'],keep= 'last')
3
répondu Sudharsan 2018-05-07 08:24:34

Vous pouvez le faire avec drop_duplicates comme vous le vouliez

# initialisation
d = pd.DataFrame({'A' : [1,1,2,3,3], 'B' : [2,2,7,4,4],  'C' : [1,4,1,0,8]})

d = d.sort_values("C", ascending=False)
d = d.drop_duplicates(["A","B"])

Si il est important d'obtenir le même ordre

d = d.sort_index()
0
répondu AlexT 2017-12-05 13:47:41