Jeff Tilton
Jeff Tilton

Reputation: 1296

pd.concat with multiindex

I have a multi-indexed df and I want to perform an elementwise operation on it that differs depending on a string in the level 1 column and then combine them using the same index/column structure.

dic = {'X':pd.DataFrame(np.random.randn(10, 2), columns = ['A','B']),
       'Y':pd.DataFrame(np.random.randn(10, 2), columns = ['A','B']),
       'Z':pd.DataFrame(np.random.randn(10, 2), columns = ['A','B'])}
multi = pd.concat(dic.values(),axis=1,keys=dic.keys())

a = multi[multi.filter(like='A').columns].applymap(lambda x: x>=1 and x <= 2)
b = multi[multi.filter(like='B').columns].applymap(lambda x: x>=-1 and x <= 1)

pd.concat([a,b], axis = 1) gives me the correct data

Out[164]: 
       X      Y      Z      X      Y      Z
       A      A      A      B      B      B
0  False  False  False   True  False   True
1   True   True  False   True   True  False
2  False  False  False   True  False   True
3  False  False  False  False   True   True
4  False  False  False   True   True   True
5  False  False   True  False   True   True
6  False  False  False  False   True   True
7  False  False  False   True   True   True
8  False   True  False   True  False   True
9  False  False  False   True  False  False

But I want it displayed

Out[168]: 
       X             Y             Z       
       A      B      A      B      A      B
0  False   True  False  False  False   True
1   True   True   True   True  False  False
2  False   True  False  False  False   True
3  False  False  False   True  False   True
4  False   True  False   True  False   True
5  False  False  False   True   True   True
6  False  False  False   True  False   True
7  False   True  False   True  False   True
8  False   True   True  False  False   True
9  False   True  False  False  False  False

Upvotes: 0

Views: 2865

Answers (1)

BENY
BENY

Reputation: 323226

Add sort_index

pd.concat([a,b], axis = 1).sort_index(axis=1)
Out[162]: 
       X             Y             Z       
       A      B      A      B      A      B
0  False   True  False   True  False  False
1  False   True  False   True  False   True
2  False   True  False   True  False  False
3  False   True  False   True  False   True
4  False  False  False   True  False   True
5  False   True  False  False  False   True
6  False   True  False   True  False  False
7  False   True  False   True  False   True
8  False   True   True   True  False   True
9  False  False  False   True  False  False

Upvotes: 2

Related Questions