Pandas根据级别名称连接多索引列

时间:2016-10-25 15:04:19

标签: python pandas

我看到了大熊猫的奇怪行为,也许它只是我,但我期待与我得到的结果不同。

所以假设我有一个多索引数据框,有:

import pandas as pd
df = pd.DataFrame(index=list('abcde'), data={'A': range(5), 'B': range(5)})
df_first = pd.concat({'ticker1': df, 'ticker2': df, 'ticker3': df}, axis=1)
df_first.columns = df_first.columns.rename(('ticker', 'variables'))

df_first
Out[91]: 
ticker    ticker1    ticker2    ticker3   
variables       A  B       A  B       A  B
a               0  0       0  0       0  0
b               1  1       1  1       1  1
c               2  2       2  2       2  2
d               3  3       3  3       3  3
e               4  4       4  4       4  4

和第二个具有相同级别名称但反转的数据框具有:

df2 = pd.DataFrame(index=list('abcde'), data={'ticker1': range(5), 'ticker2': range(5)})
df_sec = pd.concat({'C': df2, 'D': df2, 'E': df2}, axis=1)
df_sec.columns = df_sec.columns.rename(('variables', 'ticker'))

df_sec
Out[93]: 
variables       C               D               E        
ticker    ticker1 ticker2 ticker1 ticker2 ticker1 ticker2
a               0       0       0       0       0       0
b               1       1       1       1       1       1
c               2       2       2       2       2       2
d               3       3       3       3       3       3
e               4       4       4       4       4       4

正如您所看到的,这些级别具有相同的名称但是相反。当我在axis = 1上连接这两个数据帧时,它会混合我的列:

pd.concat([df_first, df_sec], axis=1)
Out[94]: 
ticker    ticker1    ticker2    ticker3          C               D               E        
variables       A  B       A  B       A  B ticker1 ticker2 ticker1 ticker2 ticker1 ticker2
a               0  0       0  0       0  0       0       0       0       0       0       0
b               1  1       1  1       1  1       1       1       1       1       1       1
c               2  2       2  2       2  2       2       2       2       2       2       2
d               3  3       3  3       3  3       3       3       3       3       3       3
e               4  4       4  4       4  4       4       4       4       4       4       4

我知道我可以先交换等级并获得预期的结果:

pd.concat([df_first, df_sec.swaplevel(0, 1, 1)], axis=1)
Out[95]: 
ticker    ticker1    ticker2    ticker3    ticker1 ticker2 ticker1 ticker2 ticker1 ticker2
variables       A  B       A  B       A  B       C       C       D       D       E       E
a               0  0       0  0       0  0       0       0       0       0       0       0
b               1  1       1  1       1  1       1       1       1       1       1       1
c               2  2       2  2       2  2       2       2       2       2       2       2
d               3  3       3  3       3  3       3       3       3       3       3       3
e               4  4       4  4       4  4       4       4       4       4       4       4

但有没有办法直接根据级别名称concat

感谢

1 个答案:

答案 0 :(得分:1)

我无法想到任何不以某种方式操纵列索引的内容。但这接近你所要求的。即,它在级别名称上运行。

ln = 'variables'
pd.concat([df_first.stack(ln), df_sec.stack(ln)]).unstack(ln)

enter image description here

OR

ln = 'ticker'
pd.concat([df_first.stack(ln), df_sec.stack(ln)], axis=1).unstack(ln)

enter image description here