代码之家  ›  专栏  ›  技术社区  ›  Bakira

比较具有相同列名的两个数据帧,并用后缀展平生成的数据帧

  •  1
  • Bakira  · 技术社区  · 2 年前

    我有两个数据帧:

    dfA = pd.DataFrame({
            "Run": (
                1, 1, 1, 2, 2, 2, 3, 3, 3
            ),
            "Point": (
                1, 2, 3, 1, 2, 3, 1, 2, 3
            ),
            "Val": (
                78, 79, 77, 78, 79, 77, 78, 79, 77
            )
        })
    

    dfB = pd.DataFrame({
            "Run": (
                1, 1, 1, 2, 2, 2, 3, 3, 3,
            ),
            "Point": (
                1, 2, 3, 1, 2, 3, 1, 2, 3, 
            ),
            "Val": (
                68, 69, 67, 68, 69, 67, 68, 69, 67,
            ),
        })
    

    具有

    res = dfA.compare(dfB, keep_equal=True, keep_shape=True).rename(columns={'self': 'A', 'other': 'B'}, level=-1)
    

    我得到了一个与我想要的结果完全一致的数据帧,但Dash AG Grid似乎无法处理多索引列数据帧,因此我想将“res”df压平以获得以下结构

    end_df = pd.DataFrame({
            "Run_A": (
                1, 1, 1, 2, 2, 2, 3, 3, 3,
            ),
            "Run_B": (
                1, 1, 1, 2, 2, 2, 3, 3, 3,
            ),
            "Point_A": (
                1, 2, 3, 1, 2, 3, 1, 2, 3, 
            ),
            "Point_B": (
                1, 2, 3, 1, 2, 3, 1, 2, 3, 
            ),
            "Val_A": (
                78, 79, 77, 78, 79, 77, 78, 79, 77
            ),
            "Val_B": (
                68, 69, 67, 68, 69, 67, 68, 69, 67,
            ),
        })
    

    归档所需结构的最有效方法是什么?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Andrej Kesely    2 年前

    只需将列级别与 str.join :

    res.columns = map("_".join, res.columns)
    print(res)
    

    打印:

       Run_A  Run_B  Point_A  Point_B  Val_A  Val_B
    0      1      1        1        1     78     68
    1      1      1        2        2     79     69
    2      1      1        3        3     77     67
    3      2      2        1        1     78     68
    4      2      2        2        2     79     69
    5      2      2        3        3     77     67
    6      3      3        1        1     78     68
    7      3      3        2        2     79     69
    8      3      3        3        3     77     67