带有multiindex的pd.concat

时间:2018-01-02 21:13:13

标签: pandas multi-index

我有一个多索引的df,我想对它执行元素操作,这取决于1级列中的字符串,然后使用相同的索引/列结构组合它们。

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)为我提供了正确的数据

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

但我希望它显示

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

1 个答案:

答案 0 :(得分:2)

添加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