I get how to use pd.MultiIndex.from_tuples() in order to change something like
Value
(A,a) 1
(B,a) 2
(B,b) 3
into
Assign direct to columns with the result from pd.MultiIndex.from_tuples passing in your existing columns:
In [186]:
l=[('A', 'a'), ('A', 'b'), ('B','a'), ('B','b')]
df = pd.DataFrame(np.random.randn(5,4), columns = l)
df
Out[186]:
(A, a) (A, b) (B, a) (B, b)
0 -0.876353 0.553742 1.631858 -0.561309
1 0.463058 -0.455014 -0.491336 -1.436059
2 0.337810 0.233624 -0.571749 -2.259763
3 1.073057 -0.475894 0.999643 -0.379743
4 0.441800 0.311202 -0.191552 0.291268
In [187]:
df.columns = pd.MultiIndex.from_tuples(df.columns, names=['Caps','Lower'])
df
Out[187]:
Caps A B
Lower a b a b
0 -0.876353 0.553742 1.631858 -0.561309
1 0.463058 -0.455014 -0.491336 -1.436059
2 0.337810 0.233624 -0.571749 -2.259763
3 1.073057 -0.475894 0.999643 -0.379743
4 0.441800 0.311202 -0.191552 0.291268
note that you can assign directly to names attribute of the columns attribute like the following:
df.columns.names = ['Caps','Lower']
not to be confused with the name attribute