Pandas如何匹配两个不同DataFrame的Request ID列并复制对应联系人邮箱
报错原因
- 你的代码中
df.loc['Request ID']的作用是从DataFrame的行索引中查找名为Request ID的行,而非提取Request ID列,所以触发了KeyError,提示你给出的ID值不存在于行索引中 - 即使修正了取列的写法,直接用
if判断两个Series是否相等的逻辑也不符合pandas的向量化操作规则,无法实现逐行匹配的需求
正确实现方法
下面给出两种常用的实现方案:
方案1:左连接实现(更稳妥,适合多字段匹配场景)
通过pandas的merge左连接能力,在保留df2所有原始行和字段的前提下,匹配对应Contact E-mail值:
# 仅取df1中匹配需要的字段做左连接 df2 = df2.merge( df1[['Request ID', 'Contact E-mail']], on='Request ID', how='left' ).rename(columns={'Contact E-mail': 'Email'}) # 将无匹配的空值替换为空字符串 df2['Email'] = df2['Email'].fillna('')
方案2:映射字典实现(代码更简洁,适合单字段匹配场景)
先将df1的Request ID和Contact E-mail做成映射字典,再对df2的Request ID做映射填充:
# 生成ID到邮箱的映射字典 id_email_map = df1.set_index('Request ID')['Contact E-mail'].to_dict() # 映射填充新列,无匹配项自动填充空值后替换为空字符串 df2['Email'] = df2['Request ID'].map(id_email_map).fillna('')
注意事项
如果运行后所有Email值都为空,大概率是两个DataFrame的Request ID列数据类型不一致导致的(比如一个为整数类型、一个为字符串类型),可先统一类型后再运行匹配逻辑:
# 统一转为字符串类型 df1['Request ID'] = df1['Request ID'].astype(str) df2['Request ID'] = df2['Request ID'].astype(str)
内容的提问来源于stack exchange,提问作者Lucas Brodersen
相关产品推荐
相关产品推荐

