Tri pandas dataframe à la fois sur les valeurs d'une colonne et d'un index?

est-il possible de trier les données pandas par les valeurs d'une colonne, mais aussi par index?

si vous triez une dataframe de pandas par les valeurs d'une colonne, vous pouvez obtenir la dataframe résultante triée par la colonne, mais malheureusement, vous voyez l'ordre du désordre de l'index de votre dataframe dans la même valeur d'une colonne triée.

alors, puis-je trier une base de données par une colonne, telle que la colonne nommée count mais aussi le Trier par la valeur de l'index? Et est-il également possible de trier les colonne par ordre décroissant, mais alors que Trier un index par ordre ascendant?

je sais trier plusieurs colonnes dans dataframe, et je sais aussi que je peux réaliser ce que je demande ici en premier reset_index() l'index et le trier, puis créer l'index à nouveau. Mais il est plus intuitif et efficace pour le faire?

22
demandé sur feetwet 2013-11-29 06:15:02

7 réponses

je dirais que la façon la plus simple est de simplement copier votre index sur une colonne, et ensuite Trier par les deux.

df['colFromIndex'] = df.index
df = df.sort(['count', 'colFromIndex'])
df.sort(['count', 'index']), mais bien sûr, cela ne fonctionne pas.

21
répondu fantabolous 2015-07-26 13:09:18

à partir de pandas version 0.22.

Vous pouvez activer temporairement la colonne comme un indice, trier l'index sur cette colonne, puis réinitialiser. Par défaut, il maintiendra l'ordre de l'index existant:

df = df.set_index('column_name', append=True).sort_index(level=1).reset_index(level=1)

je pense que ce qui précède pourrait être fait avec des options "inplace" mais je pense que c'est plus facile à lire comme ci-dessus.

4
répondu Iain D 2018-06-15 09:27:16

Pour trier une colonne descendante, tout en maintenant l'indice croissant:

import pandas as pd
df = pd.DataFrame(index=range(5), data={'c': [4,2,2,4,2]})
df.index = df.index[::-1]
print df.sort(column='c', ascending=False)

Sortie:

   c
1  4
4  4
0  2
2  2
3  2
1
répondu cyborg 2013-11-29 04:16:27

Vous pouvez utiliser une combinaison de groupby et appliquer:

In [2]: df = pd.DataFrame({
            'transID':  range(8),
            'Location': ['New York','Chicago','New York','New York','Atlanta','Los Angeles',
                            'Chicago','Atlanta'],
            'Sales':    np.random.randint(0,10000,8)}).set_index('transID')
In [3]: df
Out[3]:
        Location    Sales
transID
0       New York    1082
1       Chicago     1664
2       New York    692
3       New York    5669
4       Atlanta     7715
5       Los Angeles 987
6       Chicago     4085
7       Atlanta     2927

In [4]: df.groupby('Location').apply(lambda d: d.sort()).reset_index('Location',drop=True)
Out[4]:
        Location    Sales
transID
4       Atlanta     7715
7       Atlanta     2927
1       Chicago     1664
6       Chicago     4085
5       Los Angeles 987
0       New York    1082
2       New York    692
3       New York    5669

je drop "Localisation" dans la dernière ligne car groupby insère les groupes de niveaux dans les premières positions dans l'index. Les trier puis les laisser tomber préserve l'ordre trié.

1
répondu delgadom 2014-11-19 18:36:12

Vous pouvez utiliser le croissant paramètre dans sort_index, mais vous devez passer comme une liste pour qu'il fonctionne correctement comme des pandas 0.22.0.

import pandas as pd
import numpy as np
df = pd.DataFrame({'idx_0':[2]*6+[1]*5,
                   'idx_1':[6,4,2,10,18,5,11,1,7,9,3],
                   'value_1':np.arange(11,0,-1),
                   'MyName':list('SORTEDFRAME')})

df = df.set_index(['idx_0','idx_1'])
df

Sortie:

            MyName  value_1
idx_0 idx_1                
2     6          S       11
      4          O       10
      2          R        9
      10         T        8
      18         E        7
      5          D        6
1     11         F        5
      1          R        4
      7          A        3
      9          M        2
      3          E        1

Tri par valeurs et index devrait obtenir "FRAMESORTED" au lieu de"SORTEDFRAME"

df.sort_values('value_1', ascending=False)\
  .sort_index(level=0, ascending=[True])

Sortie:

            MyName  value_1
idx_0 idx_1                
1     11         F        5
      1          R        4
      7          A        3
      9          M        2
      3          E        1
2     6          S       11
      4          O       10
      2          R        9
      10         T        8
      18         E        7
      5          D        6

Remarque: vous devez passer ascending paramètre sort_index comme une liste et non pas comme un scalaire. Il ne fonctionnera pas.

0
répondu Scott Boston 2018-04-30 20:08:12

je crois qu'à l'origine, de l'ordre de sort_values est conservé même quand sort_index est appliqué, donc cela devrait fonctionner:

df.sort_values('count', ascending=False).sort_index(level=[index_level1, index_level2])
-2
répondu kekert 2017-07-18 07:36:55

- je résoudre ce problème de la façon suivante:

df.to_csv('df.csv', index = False)
df = df.read_csv('df.csv')
-11
répondu romandos 2015-12-05 17:18:43