首页 > 解决方案 > 基于多列python的join

问题描述

数据框:

df1:

col1        col2        col3        col4        col5        col6        col7        col8 
7865                                                                                abc
                                    7269        689                                 def
            8726                                                                    ghi
                                                                        986         jkl
                                                7689                                mno
                        8762                                                        pqr
                                                                                    stu
                        9698                                                        vwx
            3568                                                                    yz

df2:

Scientific value         mapping_value
1                        8726
2                        9698
3                        3568
4                        986
5                        7269

我想将 df1 中的“col1、col2、col3、col4、col5、col6、col7”列值与 df2 中的“mapping_value”列匹配,并在 df1 中创建一个名为“科学价值”的新列,其中包含来自“科学价值”的条目" df2 中的列。

输出:

col1        col2        col3        col4        col5        col6        col7        col8   Scientific value
7865                                                                                abc    
                                    7269        689                                 def    5
            8726                                                                    ghi    1
                                                                        986         jkl    4
                                                7689                                mno
                        8762                                                        pqr
                                                                                    stu
                        9698                                                        vwx    2
            3568                                                                    yz     3

谢谢!

标签: pythonpandasdataframe

解决方案


我注意到:

  • df1中的所有列都是对象类型(实际上是string),
  • 但df2中的所有列(包括mapping_value)都是int类型。

因为必须在mapping_valuecol...列之间执行连接之类的操作,所以必须将它们带入一个通用类型,例如使用一些辅助对象。

所以首先要做的是创建一个“映射器”系列

  • 取自df2['Scientific value'] 的值
  • 索引取自df2.mapping_value,但转换为string

执行此操作的代码是:

mapper = df2.set_index('mapping_value')['Scientific value']
mapper.index = mapper.index.astype(str); mapper

然后定义一个函数来获取科学值(“真”值或“否定”情况下的空字符串):

def getScVal(row):
    rw = row[:-1]    # without "col8" 
    rw = rw[rw != ''].to_frame('code').set_index('code')
    res = rw.join(mapper, how='inner')
    return res.iloc[0,0] if res.size > 0 else ''

并生成新列,运行:

df1['Scientific value'] = df1.apply(getScVal, axis=1)

推荐阅读