【问题标题】:Convert column suffixes from pandas join into a MultiIndex将 pandas join 中的列后缀转换为 MultiIndex
【发布时间】:2019-04-07 02:43:18
【问题描述】:

我有两个具有(不一定)相同索引和列名的 pandas DataFrame。

>>> 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

有没有一种方法可以将两个原始 DataFrame 组合起来以获得所需的 DataFrame?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将pd.concatkeys 参数一起使用,沿第一个轴:

    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
    

    【讨论】:

    • 这假定 df_L 和 df_R 具有相同的行数(可能还有列数)。 df_L和df_R的形状不匹配怎么办?
    【解决方案2】:

    对于那些寻找将具有不同索引或列的两个数据框连接到多索引表中的更普遍问题的答案的人:

    # Prepend a key-level to the column index
    # https://stackoverflow.com/questions/14744068
    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])
    

    【讨论】:

    • 我发现这个答案比公认的答案更可靠。附带说明一下,df_L.columns = pd.MultiIndex.from_product([["L", ], df_L.columns]) 可能更干净一些
    • @RaphaelD。没错,你的建议更干净。但它仅在初始 df_L 还没有多索引标头时才有效。我参考this SO post 了解如何将级别添加到现有的多级索引。
    猜你喜欢
    • 2022-11-01
    • 2023-03-02
    • 2017-11-24
    • 2013-03-22
    • 2020-05-27
    • 2018-07-25
    • 2019-06-12
    • 2018-12-12
    • 1970-01-01
    相关资源
    最近更新 更多