【问题标题】:Joining two unequal dataframes连接两个不相等的数据框
【发布时间】:2017-04-10 14:05:35
【问题描述】:

我有两个长度不等的数据框。第一个数据框(df1)的 A 列具有唯一值,并且对应于同一数据框中的 B 列和 C 列。 第二个数据框(df2)具有名为列 A 的列,该列具有 df1 的 A 列值的多次重复,并且对应于 D 列和 E 列。 我想在 A 列上将 df1 连接到 df2,这样它们形成一个数据框,B 列和 C 列的值与 df1 中的值相对应。

Df1

  column A. Column B

A.                     ab
B.                      bc
C.                      fg

Df2
Column A   column D
A.                      1
B.                       2
C.                       3
B.                        4
A.                        5
A.                         6



Df1 + Df2

Column A column D column B
A.                  1.              ab
B.                  2.               bc
C.                   3.              fg
B.                   4.              bc
A.                   5.              ab 
A.                    6.              ab

怎么做?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果只有两个 DataFrame 中的公共列通过左连接连接列 Column A,则可以使用不带参数 onmerge

    print (DF1)
      Column A Column B  Column C
    0       A.       ab         1
    1       B.       bc         9
    2       C.       fg         7
    
    print (DF2)
      Column A  column D  column E
    0       A.         1         8
    1       B.         2         9
    2       C.         3         7
    3       B.         4         3
    4       A.         5         1
    5       A.         6         0
    

    df = DF2.merge(DF1,how='left')
    print (df)
      Column A  column D  column E Column B  Column C
    0       A.         1         8       ab         1
    1       B.         2         9       bc         9
    2       C.         3         7       fg         7
    3       B.         4         3       bc         9
    4       A.         5         1       ab         1
    5       A.         6         0       ab         1
    

    如果多个相同的列添加on:

    df = DF2.merge(DF1,how='left', on='Column A')
    print (df)
      Column A  column D  column E Column B  Column C
    0       A.         1         8       ab         1
    1       B.         2         9       bc         9
    2       C.         3         7       fg         7
    3       B.         4         3       bc         9
    4       A.         5         1       ab         1
    5       A.         6         0       ab         1
    

    【讨论】:

      【解决方案2】:

      假设'Column A'是唯一的公共列,merge默认使用所有公共列。

      DF2.merge(DF1, 'left')
      
        Column A  column D  column E Column B  Column C
      0       A.         1         8       ab         1
      1       B.         2         9       bc         9
      2       C.         3         7       fg         7
      3       B.         4         3       bc         9
      4       A.         5         1       ab         1
      5       A.         6         0       ab         1
      

      join使用索引,所以我们将DF1join的索引设置为DF2。默认情况下,它还需要我们设置DF2 的索引,但我们指定on='Column A' 参数,以便我们可以将'Column A' 保留在正确的数据框中。

      DF2.join(DF1.set_index('Column A'), on='Column A')
      
        Column A  column D  column E Column B  Column C
      0       A.         1         8       ab         1
      1       B.         2         9       bc         9
      2       C.         3         7       fg         7
      3       B.         4         3       bc         9
      4       A.         5         1       ab         1
      5       A.         6         0       ab         1
      

      【讨论】:

      • @jezrael。这就是为什么 pandas 标签是神奇的。几乎所有合理构建的问题都将被充分涵盖......而且很快。
      猜你喜欢
      • 1970-01-01
      • 2021-04-04
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      相关资源
      最近更新 更多