使用Pandas对比两个DataFrame,按规则新增列并替换列值
问题描述
现有两个DataFrame:df1和df2,需在df1中新增Task Name Support列,并按指定规则修改列值及Task Role列内容。
原始数据结构
df1结构:
| Task Name | Task Role |
|---|---|
| Review done-RE432 | Assignee1 |
| Result generated | Manager1 |
| Results-RW212312 | Assignee2 |
| #hold-results | Assignee2 |
| Change received-WE22321 | Assignee2 |
| ... | ... |
df2结构:
| Task Names |
|---|
| Review change |
| Results generated |
| Review done |
| Change received |
| ... |
处理规则
- 若df1的
Task Name包含df2中某一Task Names内容(例如Review done匹配Review done-RE432),则将df2对应值填入Task Name Support; - 若不匹配(例如
#hold-results),则将df1原Task Name值填入Task Name Support; - 匹配时保持
Task Role原有值不变; - 不匹配时将
Task Role替换为Unknown。
实现代码
使用Python的Pandas库可完成需求,代码如下:
import pandas as pd # 假设df1和df2已加载完成 # 提取df2中的任务名称列表 task_patterns = df2['Task Names'].tolist() # 定义匹配函数:返回对应支持名称和匹配状态 def match_task(task_name): for pattern in task_patterns: if pattern in task_name: return pattern, True return task_name, False # 应用匹配逻辑到df1的每一行 df1[['Task Name Support', 'is_matched']] = df1['Task Name'].apply( lambda x: pd.Series(match_task(x)) ) # 根据匹配状态更新Task Role列 df1['Task Role'] = df1.apply( lambda row: row['Task Role'] if row['is_matched'] else 'Unknown', axis=1 ) # 移除临时的匹配状态列 df1.drop('is_matched', axis=1, inplace=True)
代码解释
- 先将df2的任务名称转为列表,便于遍历匹配;
- 定义
match_task函数:遍历目标任务名称,检查是否包含在当前Task Name中,匹配成功返回目标名称和匹配标记,失败返回原名称和未匹配标记; - 用
apply函数将匹配逻辑应用到df1每行,生成Task Name Support列和临时匹配标记列; - 根据匹配标记更新
Task Role,未匹配行替换为Unknown; - 移除临时标记列,得到最终结果。
验证结果
处理后的df1结构如下:
| Task Name | Task Role | Task Name Support |
|---|---|---|
| Review done-RE432 | Assignee1 | Review done |
| Result generated | Manager1 | Results generated |
| Results-RW212312 | Unknown | Results-RW212312 |
| #hold-results | Unknown | #hold-results |
| Change received-WE22321 | Assignee2 | Change received |
| ... | ... | ... |
内容的提问来源于stack exchange,提问作者Rachana vankayalapati
相关产品推荐
相关产品推荐

