python - How can I rearrange the index level with Pandas? -
the purpose of post try understand how best manipulate dataframes multilevels.
create dataframe
import numpy np dates = pd.date_range('20130101', periods=6) df = pd.dataframe(np.random.randn(6,4), index=dates, columns=list('wxyz')) df['portfolio']= list('abcdef') df
dataframe
y z portfolio 01/01/2013 1 2 02/01/2013 3 4 b 03/01/2013 5 6 c 04/01/2013 7 8 d 05/01/2013 9 10 e 06/01/2013 11 12 f
pivot dataframe
dfs_pivot = df.pivot(columns='portfolio') dfs_pivot
pivoted dateframe
y z portfolio b c d e f b c d e f 2013-01-01 1 nan nan nan nan nan 2 nan nan nan nan nan 2013-01-02 nan 3 nan nan nan nan nan 4 nan nan nan nan 2013-01-03 nan nan 5 nan nan nan nan nan 6 nan nan nan 2013-01-04 nan nan nan 7 nan nan nan nan nan 8 nan nan 2013-01-05 nan nan nan nan 9 nan nan nan nan nan 10 nan 2013-01-06 nan nan nan nan nan 11 nan nan nan nan nan 12
how can levels switched give?
portfolio b c d e f y z y z y z y z y z y z 2013-01-01 1 2 nan nan nan nan nan nan nan nan nan nan 2013-01-02 nan nan 3 4 nan nan nan nan nan nan nan nan 2013-01-03 nan nan nan nan 5 6 nan nan nan nan nan nan 2013-01-04 nan nan nan nan nan nan 7 8 nan nan nan nan 2013-01-05 nan nan nan nan nan nan nan nan 9 10 nan nan 2013-01-06 nan nan nan nan nan nan nan nan nan nan 11 12
to swap order of multiindex levels, use dataframe.swaplevel
:
import numpy np import pandas pd dates = pd.date_range('20130101', periods=6) df = pd.dataframe(np.random.randint(10, size=(6,2)), index=dates, columns=list('yz')) df['portfolio']= list('abcdef') dfs_pivot = df.pivot(columns='portfolio').swaplevel(0, 1, axis=1)
yields
portfolio b c d e f b c d e f y y y y y y z z z z z z 2013-01-01 7.0 nan nan nan nan nan 9.0 nan nan nan nan nan 2013-01-02 nan 4.0 nan nan nan nan nan 3.0 nan nan nan nan 2013-01-03 nan nan 8.0 nan nan nan nan nan 2.0 nan nan nan 2013-01-04 nan nan nan 5.0 nan nan nan nan nan 7.0 nan nan 2013-01-05 nan nan nan nan 4.0 nan nan nan nan nan 7.0 nan 2013-01-06 nan nan nan nan nan 3.0 nan nan nan nan nan 9.0
to sort columns call dataframe.sortlevel
:
dfs_pivot = dfs_pivot.sortlevel(axis=1)
yields
portfolio b c d e f y z y z y z y z y z y z 2013-01-01 7.0 9.0 nan nan nan nan nan nan nan nan nan nan 2013-01-02 nan nan 4.0 3.0 nan nan nan nan nan nan nan nan 2013-01-03 nan nan nan nan 8.0 2.0 nan nan nan nan nan nan 2013-01-04 nan nan nan nan nan nan 5.0 7.0 nan nan nan nan 2013-01-05 nan nan nan nan nan nan nan nan 4.0 7.0 nan nan 2013-01-06 nan nan nan nan nan nan nan nan nan nan 3.0 9.0
to rearrange columns in custom order, call reindex
:
custom_order = [('e', 'z'), ('d', 'z'), ('c', 'z'), ('f', 'z'), ('f', 'y'), ('b', 'z'), ('c', 'y'), ('e', 'y'), ('a', 'z'), ('a', 'y'), ('b', 'y'), ('d', 'y')] dfs_pivot = dfs_pivot.reindex(columns=custom_order)
or, more simply, use column-indexing syntax:
dfs_pivot = dfs_pivot[custom_order]
which yields
portfolio e d c f b c e b d z z z z y z y y z y y y 2013-01-01 nan nan nan nan nan nan nan nan 9.0 7.0 nan nan 2013-01-02 nan nan nan nan nan 3.0 nan nan nan nan 4.0 nan 2013-01-03 nan nan 2.0 nan nan nan 8.0 nan nan nan nan nan 2013-01-04 nan 7.0 nan nan nan nan nan nan nan nan nan 5.0 2013-01-05 7.0 nan nan nan nan nan nan 4.0 nan nan nan nan 2013-01-06 nan nan nan 9.0 3.0 nan nan nan nan nan nan nan
Comments
Post a Comment