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
Post a Comment