2016-10-25 16 views
1

私はパンダからの奇妙な行動を見ています。多分それは私ですが、私は私が得ているものとは異なる結果を期待しています。レベルの名前に基づくマルチインデックス列のパンダ連結

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に、これらの2のデータフレームをCONCATとき、それは私のコラムをアップミックス:

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

私はいくつかの方法で、列のインデックスを操作していないものを考えることはできません。しかし、これはあなたが求めたものに近づきます。つまり、レベル名で動作します。

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

関連する問題