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?
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.
à 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.
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
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é.
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.
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])
- je résoudre ce problème de la façon suivante:
df.to_csv('df.csv', index = False)
df = df.read_csv('df.csv')