我看到了大熊猫的奇怪行为,也许它只是我,但我期待与我得到的结果不同。
所以假设我有一个多索引数据框,有:
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
?
感谢