我尝试着想出一个解决方案,用于在 pandas 数据框中查找和填充附加列以提高可读性。
以下数据(已截断)可用,其中 manager_id 填充相应的 user_ids
姓氏 | 名字 | 用户ID | 经理_id |
---|---|---|---|
斯科塞斯 | 马丁 | 1 | 2 |
文德斯 | 维姆 | 2 | 2 |
黑泽 | 晃 | 3 | 3 |
萨布 | 萨布 | 4 | 3 |
结果应该是:
姓氏 | 名字 | 用户ID | 经理_id | 经理姓名 |
---|---|---|---|---|
斯科塞斯 | 马丁 | 1 | 2 | 维姆·文德斯 |
文德斯 | 维姆 | 2 | 2 | 维姆·文德斯 |
黑泽 | 晃 | 3 | 3 | 黑泽明 |
萨布 | 萨布 | 4 | 3 | 黑泽明 |
到目前为止,我一直在努力寻找一个简洁而好的解决方案,仅使用基于 pandas 的方法。我有一个可行的解决方案,但这是一个肮脏的黑客,迭代同一数据帧的字典并根据名称等查找行索引。非常丑陋。
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
有人可以阐明如何在没有字典破解和迭代的情况下有效地完成此操作吗?
非常感谢。
你可以简单地这样做
import pandas as pd
data = {
'last_name': ['Scorsese', 'Wenders', 'Kurosawa', 'Sabu'],
'first_name': ['Martin', 'Wim', 'Akira', 'Sabu'],
'user_id': [1, 2, 3, 4],
'manager_id': [2, 2, 3, 3]
}
df = pd.DataFrame(data)
name_map = df.set_index('user_id')['first_name'] + ' ' + df.set_index('user_id')['last_name']
df['manager_name'] = df['manager_id'].map(name_map)
print(df)
这给出了
last_name first_name user_id manager_id manager_name
0 Scorsese Martin 1 2 Wim Wenders
1 Wenders Wim 2 2 Wim Wenders
2 Kurosawa Akira 3 3 Akira Kurosawa
3 Sabu Sabu 4 3 Akira Kurosawa
[ ]