首页 文章

Pandas通过两列连接DataFrames

提问于
浏览
5

你能帮我加入两个DataFrames吗?

我有两个DataFrame .

DF1:

index   val1    val2
--------------------
1       str1    abc1
2       str2    abc2
3       str3    abc3
4       str4    abc9
5       str5    abc4

DF2:

index   val2
------------
1       abc1
2       abc2
4       abc3 
5       abc4
9       abc5

我需要基于前两个创建一个DataFrame,左边连接两列 . 列索引和val2在两个DataFrame中具有相同的名称 . df3的结果应如下所示:

index   val1    val2    val3
----------------------------
1       str1    abc1    1
2       str2    abc2    1
3       str3    abc3    NaN
4       str4    abc9    NaN
5       str5    abc4    1

如果df1中的索引与df2中的val2相同,则应删除df2中不存在的df2索引,然后将1添加到新列val3中,否则:NaN .

非常感谢提前!

3 回答

  • 1

    您可以尝试使用 join (默认为左侧)和 rsuffix ,以便使用后缀重命名df2的列名 . 然后,使用 np.where 检查列值是否匹配并为 val3 列分配值 .

    import numpy as np
    
    df = df1.join(df2, rsuffix='_df2')
    df['val3'] = np.where(df.val2 == df.val2_df2, 1, np.NaN)
    del df['val2_df2']
    print(df)
    

    结果:

    val1  val2  val3
    index                  
    1      str1  abc1   1.0
    2      str2  abc2   1.0
    3      str3  abc3   NaN
    4      str4  abc9   NaN
    5      str5  abc4   1.0
    
  • 2

    这是一种方式 . 如下所示,我建议您使用布尔而不是 float 来表示 val3 ,就像系列所代表的那样 .

    # merge and set index
    res = df1.merge(df2, how='left').set_index('index')
    
    # map val2 from df2
    res['val3'] = df2.set_index('index')['val2']
    
    # check for equality of val3 and val2
    res['val3'] = res['val3'] == res['val2']
    
    print(res)
    
           val1  val2   val3
    index                   
    1      str1  abc1   True
    2      str2  abc2   True
    3      str3  abc3  False
    4      str4  abc9  False
    5      str5  abc4   True
    
  • 2

    由于您希望合并索引和列的组合,您可以将它们全部添加到索引,或者在合并之前添加 reset_index . 我们还将 val3 列分配给df2,以便它被合并 .

    (df1.reset_index().merge(
         df2.reset_index().assign(val3 = 1), on=['index', 'val2'], how='left')
        .set_index('index'))
    

    输出:

    val1  val2  val3
    index                  
    1      str1  abc1   1.0
    2      str2  abc2   1.0
    3      str3  abc3   NaN
    4      str4  abc9   NaN
    5      str5  abc4   1.0
    

    如果 'index' 只是一个列而不是索引,那么就像指定要合并的两个键一样简单 .

    df1.merge(df2.assign(val3 = 1), on=['index', 'val2'], how='left')
    

    输出:

    index  val1  val2  val3
    0      1  str1  abc1   1.0
    1      2  str2  abc2   1.0
    2      3  str3  abc3   NaN
    3      4  str4  abc9   NaN
    4      5  str5  abc4   1.0
    

相关问题