如何在id匹配时将DataFrame的redness列值复制到另一个DataFrame
解决方法
首先要注意:你的两个DataFrame里id的数据类型不统一——df_p的id是字符串(比如'2'),df_c的id是整数(比如2),直接匹配会对应不上,得先统一类型。
下面提供两种可行的实现方式:
方式一:用merge(推荐用于复杂数据结构)
merge能自动处理df_c里的重复id,并且保留df_c的所有行,匹配不到的会显示NaN(后续可按需填充)。
import pandas as pd # 你的原始数据 lst_p = [['2', 0], ['3', 1], ['4', 0], ['5', 0]] df_p = pd.DataFrame(lst_p, columns=['id', 'redness']) lst_c = [['apple', 2], ['orange', 2], ['banana', 3], ['kiwi', 4], ['cherry', 5]] df_c = pd.DataFrame(lst_c, columns=['name', 'id']) # 统一id类型:把df_p的id转为整数(也可以把df_c的id转成字符串,效果一样) df_p['id'] = df_p['id'].astype(int) # 左连接合并,保留df_c所有行,匹配对应redness值 df_c = df_c.merge(df_p, on='id', how='left')
执行后df_c的结果:
| name | id | redness |
|---|---|---|
| apple | 2 | 0 |
| orange | 2 | 0 |
| banana | 3 | 1 |
| kiwi | 4 | 0 |
| cherry | 5 | 0 |
方式二:用map(适合简单匹配场景)
先把df_p转成id到redness的映射字典,再给df_c新增列做映射:
# 统一类型后生成映射字典 redness_map = df_p.astype({'id': int}).set_index('id')['redness'].to_dict() # 给df_c新增redness列 df_c['redness'] = df_c['id'].map(redness_map)
这个方法得到的结果和merge完全一致,若df_c里有df_p没有的id,对应位置会显示NaN。
额外提示
- 如果需要处理匹配不到的id,可以用
fillna()设置默认值,比如df_c['redness'] = df_c['redness'].fillna(-1)。 - 要是
df_p里存在重复id,merge会返回多对多的结果,map则会取最后一次出现的redness值,根据你的实际需求选择即可。
内容的提问来源于stack exchange,提问作者Anelor Guinet
相关产品推荐
相关产品推荐

