python - 基于多列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
谢谢!
解决方案
我注意到:
- df1中的所有列都是对象类型(实际上是string),
- 但df2中的所有列(包括mapping_value)都是int类型。
因为必须在mapping_value和 col...列之间执行连接之类的操作,所以必须将它们带入一个通用类型,例如使用一些辅助对象。
所以首先要做的是创建一个“映射器”系列:
- 取自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)
推荐阅读
- javascript - React TypeError:this.state.projects.map 不是函数
- amazon-data-pipeline - 创建数据管道时出错 - 安全组不存在
- php - 根据订单注释触发 Woocommerce 外发电子邮件
- mysql - 根据匹配条件连接表并从 Table1.Quantity 的总和中减去 Table2.Quantity 的总和以匹配行
- r - 在R数据框中提取大于某些值的列
- c - 如何添加不断询问用户输入并将所有输入保存到文件
- c# - 如何确保从 taskList 调用的方法不会同时执行?
- python - 将多级多索引名称转换为 DataFrame 列,Python 3.6
- python - python脚本问题-语法无效
- django - Django用不同的字段注册两种不同类型的用户