首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于多列python的连接

基于多列python的连接
EN

Stack Overflow用户
提问于 2020-05-15 12:11:27
回答 2查看 253关注 0票数 0

Dataframes

df1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
Scientific value         mapping_value
1                        8726
2                        9698
3                        3568
4                        986
5                        7269

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

输出:

代码语言:javascript
复制
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

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2020-05-15 12:31:47

代码语言:javascript
复制
#Data
df=pd.DataFrame({'col1':[9698, '',''],'col2':['', 7269, ''], 'col3':['','',986]})

代码语言:javascript
复制
df2=pd.DataFrame({'Scientific value':[1,2,3,4],'mapping_value':[9698,7269,986,304]})

代码语言:javascript
复制
#Create dict
d=dict(zip(df2['mapping_value'],df2['Scientific value']))
#Apply dict to dataframe
df.apply(lambda x: x.map(d))

结果

票数 0
EN

Stack Overflow用户

发布于 2020-05-15 13:28:10

我注意到:

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

因为像join这样的东西必须在mapping_value和col之间执行。列,它们必须被带到一个公共类型,例如使用某种辅助对象。

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

  • 值取自df2 2的“科学值”,
  • 索引取自df2.mapping_value,但被转换为string.

这样做的代码是:

代码语言:javascript
复制
mapper = df2.set_index('mapping_value')['Scientific value']
mapper.index = mapper.index.astype(str); mapper

然后定义一个函数以获得科学值( "true“值或”负值“中的空字符串):

代码语言:javascript
复制
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 ''

若要生成新列,请运行:

代码语言:javascript
复制
df1['Scientific value'] = df1.apply(getScVal, axis=1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61818909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档