Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regrouping pandas multiindex columns

I am running into an issue where adding new columns to a multiindex column DataFrame causes the new columns to append to the end of the DataFrame. E.g.:

Group 1         | Group 2        | Group 1 | Group 2 |
------------------------------------------------------
Sub 1  | Sub 2  | Sub 1  | Sub 2 | New Sub | New Sub |

Whereas what I want is:

Group 1                   | Group 2                  |
------------------------------------------------------
Sub 1  | Sub 2  | New Sub | Sub 1  | Sub 2 | New Sub |

Is there a way to re-group/order my multiindex to do this? Note- I do not want to re-order the Sub Groups by name, as New Sub needs to go at the end, and alphabetically might not sort correctly.

like image 297
MarkD Avatar asked Oct 28 '25 16:10

MarkD


2 Answers

I think you need reindex or reindex_axis by custom list:

df1=pd.DataFrame(columns=pd.MultiIndex.from_product((('C','R', 'A'),(1,2))),
                 data=np.arange(6).reshape(1,-1))
df2=pd.DataFrame(columns=pd.MultiIndex.from_tuples((('C','3'),('R',5),('A',4))),
                 data=[[9,9,4]])
df=df1.join(df2)
print (df)
  C     R     A     C  R  A
   1  2  1  2  1  2  3  5  4
0  0  1  2  3  4  5  9  9  4

df1 = df.reindex(columns = ['C','R','A'], level=0)
print (df1)
   C        R        A      
   1  2  3  1  2  5  1  2  4
0  0  1  9  2  3  9  4  5  4

df1 = df.reindex_axis(['C','R','A'], level=0, axis=1)
print (df1)
   C        R        A      
   1  2  3  1  2  5  1  2  4
0  0  1  9  2  3  9  4  5  4
like image 177
jezrael Avatar answered Oct 31 '25 04:10

jezrael


You just have to call df.sort_index after setting :

df1=pd.DataFrame(columns=pd.MultiIndex.from_product((('a','b'),
(1,2))),data=np.arange(4).reshape(1,-1))
df2=pd.DataFrame(columns=pd.MultiIndex.from_tuples((('a','3'),('b',5))),data=[[9,9]])
df=df1.join(df2)

#    a     b     a  b
#    1  2  1  2  3  5
# 0  0  1  2  3  9  9

df.sort_index(axis=1,inplace=True)

#    a        b      
#    1  2  3  1  2  5
# 0  0  1  9  2  3  9
like image 41
B. M. Avatar answered Oct 31 '25 06:10

B. M.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!