基于同DataFrame内查找添加manager_name列的高效实现
基于Pandas高效添加经理姓名列的需求
我正尝试找到一种基于pandas的简洁方案,为DataFrame添加额外列以提升可读性,具体是通过同表查找填充经理姓名。现有数据(已截断)中manager_id与对应用户的user_id一致,数据如下:
| last_name | first_name | user_id | manager_id |
|---|---|---|---|
| scorsese | martin | 1 | 2 |
| wenders | wim | 2 | 2 |
| kurosawa | akira | 3 | 3 |
| sabu | sabu | 4 | 3 |
期望得到的结果如下:
| last_name | first_name | user_id | manager_id | manager_name |
|---|---|---|---|---|
| scorsese | martin | 1 | 2 | wim wenders |
| wenders | wim | 2 | 2 | wim wenders |
| kurosawa | akira | 3 | 3 | akira kurosawa |
| sabu | sabu | 4 | 3 | akira kurosawa |
目前我已实现功能,但方法是通过遍历DataFrame转换的字典,属于不够优雅的临时方案:
dictionary_of_kantoku = df_kantoku.to_dict(orient="records") for kantoku in dictionary_of_kantoku: row_index = df_kantoku.loc[ (df_kantoku['last_name'].str.contains(kantoku['last_name']) & df_kantoku['first_name'].str.contains(kantoku['first_name']))].index[0] manager_id = df_kantoku[(df_kantoku['last_name'].str.contains(kantoku['last_name']) & df_kantoku['first_name'].str.contains(kantoku['first_name']))]['manager_id'].values[0] manager_name = df_kantoku[df_kantoku['user_id'] == manager_id]['first_name'].values[0] + ' ' + df_kantoku[df_kantoku['user_id'] == manager_id]['last_name'].values[0] if row_index != 0: resultset.loc[row_index, 'manager_name'] = manager_name
希望找到无需字典遍历的高效实现方式。
高效实现方案
方法1:map结合姓名映射字典
这是最简洁高效的方式,利用Pandas矢量化操作避免遍历:
# 构建user_id到完整姓名的映射字典 manager_name_map = df_kantoku.set_index('user_id').apply( lambda x: f"{x['first_name']} {x['last_name']}", axis=1 ).to_dict() # 直接映射填充manager_name列 df_kantoku['manager_name'] = df_kantoku['manager_id'].map(manager_name_map)
方法2:自连接(merge)
如果后续需要扩展经理相关属性,自连接逻辑更直观:
# 提取经理信息并拼接姓名 manager_info = df_kantoku[['user_id', 'first_name', 'last_name']].rename( columns={'user_id': 'manager_id', 'first_name': 'manager_first', 'last_name': 'manager_last'} ) manager_info['manager_name'] = manager_info['manager_first'] + ' ' + manager_info['manager_last'] # 原表与经理信息表左连接 df_result = df_kantoku.merge(manager_info[['manager_id', 'manager_name']], on='manager_id', how='left')
方案优势
map方法:代码极简,执行效率高,适合仅需填充姓名的场景,彻底避免手动遍历和重复索引查找。merge方法:扩展性强,若后续需添加经理的其他属性(如部门、职级),只需修改经理信息表即可。
两种方案均利用Pandas内置的矢量化操作,比遍历字典的方式性能提升显著,代码可读性也更强。
内容的提问来源于stack exchange,提问作者chibisuketyan
相关产品推荐
相关产品推荐

