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

标签 python pandas

我看到 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)

enter image description here

或者

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

enter image description here

关于python - Pandas 根据级别名称连接多索引列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40243425/

相关文章:

python - 使用 bool 值或序列对象获取 numpy 数组的 View (高级索引)

python - XLDateAmbiguous 解决方法

python - 加载 txt 文件时跳过行

Python:在单个文件中获取函数和所有依赖项的好方法?

python - 如何在 Selenium 中找到这些复选框元素

python - 从图像中提取和保存字符

python - 意外的数学输出

python - “numpy.ndarray”对象没有属性 'columns'

Pandas 数据框转移日期

Pandas 订购了考试成绩的分类数据 'D' ,... ,'A+'