将Pandas join中的列后缀转换为MultiIndex

7
我有两个pandas数据框,它们的索引和列名(不一定)相同。
>>> df_L = pd.DataFrame({'X': [1, 3], 
                         'Y': [5, 7]})

>>> df_R = pd.DataFrame({'X': [2, 4], 
                         'Y': [6, 8]})

我可以将它们连接在一起并分配后缀。
>>> df_L.join(df_R, lsuffix='_L', rsuffix='_R')

    X_L Y_L X_R Y_R
0   1   5   2   6
1   3   7   4   8

但是我想要在“X”和“Y”下都创建'L'和'R'子列。

期望的DataFrame如下所示:

>>> pd.DataFrame(columns=pd.MultiIndex.from_product([['X', 'Y'], ['L', 'R']]), 
         data=[[1, 5, 2, 6],
               [3, 7, 4, 8]])

    X       Y
    L   R   L   R
0   1   5   2   6
1   3   7   4   8

有没有办法将两个原始数据框合并成所需的数据框?
2个回答

8
您可以使用pd.concat函数,通过在第一轴上使用keys参数进行合并:
df = pd.concat([df_L, df_R], keys=['L','R'],axis=1).swaplevel(0,1,axis=1).sort_index(level=0, axis=1)

>>> df
   X     Y   
   L  R  L  R
0  1  2  5  6
1  3  4  7  8

6
假设df_L和df_R具有相同的行数(可能还有列数)。如果df_L和df_R的形状不匹配呢? - Ashkan

2

对于那些寻求解决将两个具有不同索引或列的数据框合并成多级索引表的更一般问题的人:

# Prepend a key-level to the column index
# https://dev59.com/rmUq5IYBdhLWcg3wJNLg
df_L = pd.concat([df_L], keys=["L"], axis=1)
df_R = pd.concat([df_R], keys=["R"], axis=1)

# Join the two dataframes
df = df_L.join(df_R)

# Reorder levels if needed:
df = df.reorder_levels([1,0], axis=1).sort_index(axis=1)

例子:

# Data:
df_L = pd.DataFrame({'X': [1, 3, 5], 'Y': [7, 9, 11]})
df_R = pd.DataFrame({'X': [2, 4], 'Y': [6, 8], 'Z': [10, 12]})

# Result:
#    X        Y          Z
#    L    R   L    R     R
# 0  1  2.0   7  6.0  10.0
# 1  3  4.0   9  8.0  12.0
# 2  5  NaN  11  NaN   NaN


这也解决了OP相同索引和列的特殊情况。
df_L.columns = pd.MultiIndex.from_product([["L", ], df_L.columns])

1
我认为这个答案比被接受的那个更加健壮。顺便说一下,使用df_L.columns = pd.MultiIndex.from_product([["L", ], df_L.columns])可能会更加简洁。 - Raphael D.
1
@RaphaelD。确实,您的建议更简洁。但只有当初始的df_L未具有多级索引标头时才有效。我参考了这个StackOverflow帖子,以了解如何在现有多级索引前添加一个级别。 - normanius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接