python - Reorder Stacked DataFrame -


i'm trying reorder stacked dataframe. example, have:

import numpy np testdf = pd.dataframe(np.random.randn(5,4), index=range(1,6), columns = ['eric','jane','mary','don']) testdf.stack() 

and output this:

1  eric   -0.301206    jane    1.327379    mary    1.066828    don    -0.429380 2  eric    0.196671    jane   -1.232447    mary    1.139221    don     1.441183 3  eric   -0.912282    jane   -0.204741    mary   -0.802078    don     0.149269 4  eric   -0.168387    jane    1.608617    mary    2.237823    don     0.973450 5  eric   -0.290492    jane   -0.374205    mary    0.986653    don     1.584820 dtype: float64 

is there way change order of these names, without rearranging columns of original dataframe? end goal tell pandas eric, don, mary, jane desired order output later on despite not being alphabetically ordered, similar levels function in r?

what i'm trying thanks!

use set_levels on index reorder values:

in [67]:  t.index.set_levels([[1,2,3,4,5],['eric', 'don', 'mary', 'jane']], inplace=true) t out[67]: 1  eric    1.139358    don    -0.368389    mary   -1.907364    jane    0.444930 2  eric   -0.113019    don    -0.823055    mary   -1.397237    jane    0.268164 3  eric   -1.246184    don     0.356804    mary   -0.286919    jane    0.845538 4  eric   -0.674448    don     0.903695    mary    0.873403    jane   -1.321770 5  eric    1.308402    don    -1.901295    mary    0.122430    jane    0.110339 dtype: float64 

from docstrings, (there brief explanation online ):

signature: t.index.set_levels(levels, level=none, inplace=false, verify_integrity=true) docstring: set new levels on multiindex. defaults returning new index.  parameters ---------- levels : sequence or list of sequence     new level(s) apply level : int or level name, or sequence of int / level names (default none)     level(s) set (none levels) inplace : bool     if true, mutates in place verify_integrity : bool (default true)     if true, checks levels , labels compatible  returns ------- new index (of same type , class...etc)   examples -------- >>> idx = multiindex.from_tuples([(1, u'one'), (1, u'two'),                                   (2, u'one'), (2, u'two')],                                   names=['foo', 'bar']) >>> idx.set_levels([['a','b'], [1,2]]) multiindex(levels=[[u'a', u'b'], [1, 2]],            labels=[[0, 0, 1, 1], [0, 1, 0, 1]],            names=[u'foo', u'bar']) >>> idx.set_levels(['a','b'], level=0) multiindex(levels=[[u'a', u'b'], [u'one', u'two']],            labels=[[0, 0, 1, 1], [0, 1, 0, 1]],            names=[u'foo', u'bar']) >>> idx.set_levels(['a','b'], level='bar') multiindex(levels=[[1, 2], [u'a', u'b']],            labels=[[0, 0, 1, 1], [0, 1, 0, 1]],            names=[u'foo', u'bar']) >>> idx.set_levels([['a','b'], [1,2]], level=[0,1]) multiindex(levels=[[u'a', u'b'], [1, 2]],            labels=[[0, 0, 1, 1], [0, 1, 0, 1]],            names=[u'foo', u'bar']) 

update

if pandas version 0.15.0 or greater set_levels accepts level arg makes cleaner adjust 1 of levels:

in [244]:  testdf.index.set_levels(['eric', 'don', 'mary', 'jane'], level=1, inplace=true) testdf out[244]: 1  eric   -0.026484    don     0.223672    mary    0.266461    jane    1.121323 2  eric   -0.250781    don    -1.079661    mary    0.525879    jane    1.692250 3  eric   -1.337944    don     0.765228    mary   -1.297232    jane    1.121497 4  eric    2.611441    don     0.805786    mary   -0.174193    jane   -0.371906 5  eric   -0.084597    don     1.794861    mary    0.766524    jane    0.150359 dtype: float64 

Comments

Popular posts from this blog

java - Spring Data JPA: Why findOne(id) executing delete query internally? -

python - Mongodb How to add addtional information when aggregating? -

java - Incorrect order of records in M-M relationship in hibernate -