4 votes

Pandas : Trier un tableau croisé dynamique

Je viens d'essayer pandas pour la première fois, et j'essaie de trier un tableau croisé dynamique d'abord par un index, puis par les valeurs d'une série.

Jusqu'à présent, j'ai essayé :

table = pivot_table(sheet1, values='Value', rows=['A','B'], aggfunc=np.sum)

# Sorts by value ascending, can't change to descending
table.copy().sort()
table

# The following gives me the correct ordering in values, but ignores index 
sorted_table = table.order(ascending=False)
sorted_table

# The following brings me back to the original ordering
sorted_table = table.order(ascending=False)
sorted_table2 = sorted_table.sortlevel(0)
sorted_table2

Quelle est la bonne façon de trier un tableau croisé dynamique par index puis par valeur ?

9voto

Wes McKinney Points 17545

Voici une solution qui peut faire ce que vous voulez :

key1 = table.index.labels[0]
key2 = table.rank(ascending=False)

# sort by key1, then key2
sorter = np.lexsort((key2, key1))

sorted_table = table.take(sorter)

Le résultat serait le suivant :

In [22]: table
Out[22]: 
A    B    
bar  one      0.698202
     three    0.801326
     two     -0.205257
foo  one     -0.963747
     three    0.120621
     two      0.189623
Name: C

In [23]: table.take(sorter)
Out[23]: 
A    B    
bar  three    0.801326
     one      0.698202
     two     -0.205257
foo  two      0.189623
     three    0.120621
     one     -0.963747
Name: C

Il serait bon d'intégrer cette méthode dans pandas comme une méthode API. Je ne suis pas sûr de ce à quoi cela devrait ressembler.

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