【问题标题】:Pandas - Merging Two Data frames with different index names but same amount of ColumnsPandas - 合并两个索引名称不同但列数相同的数据框
【发布时间】:2022-02-16 17:26:08
【问题描述】:

我正在尝试将两个 Pandas 数据框合并在一起,但无法获得所需的结果。一个数据帧已被转置,因此我认为有一个包含列索引的标题行。另一个有一个带有列名的标题行,但是每个列都有相同的列数。

数据帧 1 (DF1):

+-----------------------------------------------------+
|      NAME      RD1     RD2     RD3     RD4     RD5  |
+-----------------------------------------------------+
| 0     Tom      4       2       1       -       3    |
| 1     Mark     2       2       3       2       1    |
| 2     James    -       1       5       5       4    |
| ...   ...      ...     ...     ...     ...     ...  |
| 30    Ted      2       3       3       3       2    |
+-----------------------------------------------------+

数据框 2 (DF2)

+--------------------------------------------------------------------+
|       0      1          2          3          4          5         |
+--------------------------------------------------------------------+
| 0     Desc   Round 1    Round 2    Round 3    Round 4    Round 5   |
| 1     Opp    Hawks      Dolphins   Raptors    Sharks     Bears     |
| 2     Date   02/04      08/04      16/04      24/04      30/04     |
| 3     Venue  MELB       PERTH      MELB       SYD        MELB      |
+--------------------------------------------------------------------+

我尝试过使用多种 pandas 方法(join/append/merge/concat)在不添加任何列的情况下连接两个数据框。然而,每种方法似乎都将列和行加在一起。我希望能够进行内部连接,但我似乎可以找到一种没有列索引号的方法。有没有办法可以使用列索引号将顶行添加到 DF1 以执行两个 DF 的内部连接?我还寻找将 DF 转换为标头的方法,但目前还没有运气。

所需的最终 DF 如下所示:

+--------------------------------------------------------------------+
|       Desc   Round 1    Round 2    Round 3    Round 4    Round 5   |
|       Opp    Hawks      Dolphins   Raptors    Sharks     Bears     |
|       Date   02/04      08/04      16/04      24/04      30/04     |
|       Venue  MELB       PERTH      MELB       SYD        MELB      |
+--------------------------------------------------------------------+
| 0     Tom    4          2          1          -          3         |
| 1     Mark   2          2          3          2          1         |
| 2     James  -          1          5          5          4         |
| ...   ...    ...        ...        ...        ...        ...       |
| 30    Ted    2          3          3          3          2         |
+--------------------------------------------------------------------+

【问题讨论】:

    标签: python pandas dataframe merge concatenation


    【解决方案1】:

    你可以使用pd.MultiIndex.from_arrays:

    df1.columns = pd.MultiIndex.from_arrays(df2.values)
    print(df1)
    
    # Output
         Desc Round 1  Round 2 Round 3 Round 4 Round 5
          Opp   Hawks Dolphins Raptors  Sharks   Bears
         Date   02/04    08/04   16/04   24/04   30/04
        Venue    MELB    PERTH    MELB     SYD    MELB
    0     Tom       4        2       1       -       3
    1    Mark       2        2       3       2       1
    2   James       -        1       5       5       4
    30    Ted       2        3       3       3       2
    

    您还可以使用推导式创建一个可用作MultiIndex 的元组:

    df1.columns = tuple(tuple(l) for l in df2.T.values)
    print(df1)
    
    # Output
         Desc Round 1  Round 2 Round 3 Round 4 Round 5
          Opp   Hawks Dolphins Raptors  Sharks   Bears
         Date   02/04    08/04   16/04   24/04   30/04
        Venue    MELB    PERTH    MELB     SYD    MELB
    0     Tom       4        2       1       -       3
    1    Mark       2        2       3       2       1
    2   James       -        1       5       5       4
    30    Ted       2        3       3       3       2
    

    【讨论】:

      【解决方案2】:

      我认为您需要 MultiIndex 由另一个 DataFrame 由 MultiIndex.from_frame 转置:

      DF1.columns = pd.MultiIndex.from_frame(DF2.T, names= [None] * len(DF2))
      print (DF1)
           Desc Round 1  Round 2 Round 3 Round 4 Round 5
            Opp   Hawks Dolphins Raptors  Sharks   Bears
           Date   02/04    08/04   16/04   24/04   30/04
          Venue    MELB    PERTH    MELB     SYD    MELB
      0     Tom       4        2       1       -       3
      1    Mark       2        2       3       2       1
      2   James       -        1       5       5       4
      30    Ted       2        3       3       3       2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-29
        • 2016-11-01
        • 2016-08-12
        • 2021-11-30
        • 2021-03-20
        • 2020-09-26
        • 2020-01-02
        相关资源
        最近更新 更多