如何在同一DataFrame中匹配行列值并生成new_obj_id新列
解决DataFrame生成new_obj_id列的问题
原始DataFrame结构
| obj_id | Column B | Column C |
|---|---|---|
| a1 | cat | bat |
| a2 | bat | man |
| r1 | man | apple |
| r2 | apple | cat |
需求与预期结果
需要新增new_obj_id列,结合预期结果,实际规则应为:当前行Column C的值与某行的Column B值匹配时,new_obj_id取该行的obj_id,最终预期结果如下:
| obj_id | Column B | Column C | new_obj_id |
|---|---|---|---|
| a1 | cat | bat | a2 |
| a2 | bat | man | r1 |
| r1 | man | apple | r2 |
| r2 | apple | cat | a1 |
原代码的问题
你提供的代码存在两处关键错误:
dataframe1['new_obj_id'] = dataframe1.apply(lambda x: x['obj_id'] if x['Column_B'] in x['Column C'] else 'none', axis=1)
- 列名错误:原始DataFrame的列是
Column B(带空格),但代码中写的是Column_B(下划线),会导致无法正确取值。 - 逻辑完全偏离需求:代码判断的是当前行的
Column_B值是否是当前行Column C值的子字符串,而不是在整个DataFrame中找到与当前行值匹配的其他行,并获取其obj_id。
正确解决方案
我们可以通过创建映射字典的方式高效实现需求,代码如下:
# 创建Column B到obj_id的映射字典 b_to_obj = df.set_index('Column B')['obj_id'].to_dict() # 生成new_obj_id列:用Column C的值去匹配映射字典 df['new_obj_id'] = df['Column C'].map(b_to_obj)
代码解释
df.set_index('Column B')['obj_id'].to_dict():将Column B的每个值作为键,对应的obj_id作为值,生成字典{'cat': 'a1', 'bat': 'a2', 'man': 'r1', 'apple': 'r2'}。df['Column C'].map(b_to_obj):遍历每行的Column C值,用映射字典找到对应的obj_id,直接生成new_obj_id列,完全符合预期结果。
如果严格按照你文字描述的需求(当前行Column B的值匹配某行Column C值时取该行obj_id),只需将映射逻辑调换:
c_to_obj = df.set_index('Column C')['obj_id'].to_dict() df['new_obj_id'] = df['Column B'].map(c_to_obj)
内容的提问来源于stack exchange,提问作者priyal shah
相关产品推荐
相关产品推荐

