5 votes

Trier un sous-ensemble de lignes de pandas df (dans un groupe) par une colonne spécifique

J'ai le cadre de données suivant, par exemple :

df

A B C D E
z k s 7 d
z k s 6 l
x t r 2 e
x t r 1 x
u c r 8 f
u c r 9 h
y t s 5 l
y t s 2 o

Et je voudrais les trier sur la base de la colonne D pour chaque sous-ligne (qui a par exemple les mêmes colonnes A, B et C dans ce cas).

Le résultat attendu serait :

df

A B C D E
z k s 6 l
z k s 7 d
x t r 1 x
x t r 2 e
u c r 8 f
u c r 9 h
y t s 2 o
y t s 5 l

Une aide pour ce type d'opération ?

5voto

Saed SayedAhmed Points 372

Je pense que ça devrait être aussi simple que ça :

df = df.sort_values(["A", "B", "C", "D"])

2voto

Ehsan Points 10771

Vous pouvez utiliser des valeurs de groupby et de tri (crédit également à @Henry Ecker pour son commentaire) :

df.groupby(['A','B','C'],group_keys=False,sort=False).apply(pd.DataFrame.sort_values,'D')

sortie :

    A   B   C   D   E
1   z   k   s   6   l
0   z   k   s   7   d
3   x   t   r   1   x
2   x   t   r   2   e
4   u   c   r   8   f
5   u   c   r   9   h
7   y   t   s   2   o
6   y   t   s   5   l

2voto

W-B Points 94428

Essayons ngroup créer le col d'aide

df['new1'] = df.groupby(['A','B','C'],sort=False).ngroup()
df = df.sort_values(['new1','D']).drop('new1',axis=1)
df
   A  B  C  D  E
1  z  k  s  6  l
0  z  k  s  7  d
3  x  t  r  1  x
2  x  t  r  2  e
4  u  c  r  8  f
5  u  c  r  9  h
7  y  t  s  2  o
6  y  t  s  5  l

1voto

Amin Ba Points 350
dic = {
    'A': [*'zzxxuuyy'],
    'B': [*'kkttcctt'],
    'C': [*'ssrrrrss'],
    'D': [*map(int, '76218952')],
    'E': [*'dlexfhlo']
}
df = pd.DataFrame(dic)

df.groupby(['A', 'B']).apply(lambda df: df.sort_values('D')).droplevel(['A', 'B']).reset_index()

si vous voulez trier sur la base des colonnes 'A', 'B', 'C', 'E', vous devez le faire :

df.groupby(['A', 'B', 'D', 'E']).apply(lambda df: df.sort_values('D')).droplevel(['A', 'B', 'D', 'E']).reset_index()

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