python - Rename level in multiindex/multilevel Pandas DataFrame -


i have dataframe this:

arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),           np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']),           np.array(['2016-01', '2016-02', '2016-01', '2016-02', '2016-01', '2016-02', '2016-01', '2016-02'])] df = pd.dataframe(np.ceil(np.random.randn(8, 4)), index=arrays)  df.rename(columns={0:'m1',1:'m2',2:'m3',3:'m4'},inplace=true)                    m1   m2   m3   m4 bar 1 2016-01 -0.0  1.0  3.0  2.0     2 2016-02  1.0  1.0  1.0  2.0 baz 1 2016-01 -1.0 -1.0  2.0  1.0     2 2016-02  1.0  2.0  1.0  2.0 foo 1 2016-01  1.0 -0.0 -0.0 -0.0     2 2016-02 -2.0 -0.0 -0.0 -0.0 qux 1 2016-01 -0.0 -0.0 -1.0  1.0     2 2016-02 -0.0 -0.0  1.0 -0.0 

let's want replace 2016 2017 in column name m2 , m4 2016 rows have values m1 , m3 not m2 , m4. , 2017 rows have values m2 , m4 not m1 , m3. similar dataframe:

                  m1   m2   m3   m4 bar 1 2016-01 -0.0  0.0  3.0  0.0     2 2016-02  1.0  0.0  1.0  0.0     1 2017-01  0.0  1.0  0.0  2.0     2 2017-02  0.0  1.0  0.0  2.0 baz 1 2016-01 -1.0  0.0  2.0  0.0     2 2016-02  1.0  0.0  1.0  0.0     1 2017-01  0.0 -1.0  0.0  1.0     2 2017-02  0.0  2.0  0.0  2.0 

i've tried unstack() dataframe , rename each column doesn't seem work , i'm not sure why.

df = df.unstack() df.unstack()['m2'] = df.unstack()['m2'].rename(columns = lambda t: t.replace('2016','2017')) 

import numpy np import pandas pd np.random.seed(2017)  arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),           np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']),           np.array(['2016-01', '2016-02', '2016-01', '2016-02', '2016-01', '2016-02', '2016-01', '2016-02'])] df = pd.dataframe(np.ceil(np.random.randn(8, 4)), index=arrays)  df.rename(columns={0:'m1',1:'m2',2:'m3',3:'m4'},inplace=true)  df2 = df[['m2', 'm4']] df2.index = pd.multiindex.from_arrays(     [df.index.get_level_values(i) in [0,1]]     + [df.index.get_level_values(-1).str.replace('2016','2017')])  result = pd.concat([df[['m1','m3']], df2], axis=0).fillna(0) result = result.sort_index(level=[0,2,1]) print(result) 

converts

                  m1   m2   m3   m4 bar 1 2016-01 -1.0 -0.0  1.0  1.0     2 2016-02 -0.0 -0.0 -0.0 -0.0 baz 1 2016-01  1.0 -0.0 -1.0 -0.0     2 2016-02 -1.0  1.0  1.0 -0.0 foo 1 2016-01 -0.0 -0.0 -1.0 -1.0     2 2016-02  2.0 -0.0 -0.0 -0.0 qux 1 2016-01  1.0  2.0 -0.0  2.0     2 2016-02  1.0  1.0 -0.0 -0.0 

into

                  m1   m2   m3   m4 bar 1 2016-01 -1.0  0.0  1.0  0.0     2 2016-02 -0.0  0.0 -0.0  0.0     1 2017-01  0.0 -0.0  0.0  1.0     2 2017-02  0.0 -0.0  0.0 -0.0 baz 1 2016-01  1.0  0.0 -1.0  0.0     2 2016-02 -1.0  0.0  1.0  0.0     1 2017-01  0.0 -0.0  0.0 -0.0     2 2017-02  0.0  1.0  0.0 -0.0 foo 1 2016-01 -0.0  0.0 -1.0  0.0     2 2016-02  2.0  0.0 -0.0  0.0     1 2017-01  0.0 -0.0  0.0 -1.0     2 2017-02  0.0 -0.0  0.0 -0.0 qux 1 2016-01  1.0  0.0 -0.0  0.0     2 2016-02  1.0  0.0 -0.0  0.0     1 2017-01  0.0  2.0  0.0  2.0     2 2017-02  0.0  1.0  0.0 -0.0 

Comments

Popular posts from this blog

ubuntu - PHP script to find files of certain extensions in a directory, returns populated array when run in browser, but empty array when run from terminal -

php - How can i create a user dashboard -

javascript - How to detect toggling of the fullscreen-toolbar in jQuery Mobile? -