Reputation: 1296
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
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