我看到 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 上连接这 2 个数据帧时,它会混合我的列:
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
?
谢谢
最佳答案
我想不出任何不以某种方式操纵列索引的东西。但这很接近您的要求。也就是说,它对级别名称进行操作。
ln = 'variables'
pd.concat([df_first.stack(ln), df_sec.stack(ln)]).unstack(ln)
或者
ln = 'ticker'
pd.concat([df_first.stack(ln), df_sec.stack(ln)], axis=1).unstack(ln)
关于python - Pandas 根据级别名称连接多索引列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40243425/