首页 > 解决方案 > 如果行在熊猫中匹配,则在列之间匹配行并创建新列

问题描述

如果我有以下数据框(df)

emp_id  email_ad                    full_nm             mgr_emp_id
65391   Pierric.Beckert@email.com   Pierric Beckert     57834
65392   Mat.Yokoyama@email.com      Mat Yokoyama        92499
65393   Kevin.Harvey@email.com      Kevin Harvey        45325

对于 中的每一行mgr_emp_id,如果mgr_emp_id与中的员工 id 匹配,则通过从列中获取名称来emp_id创建一个新列。 Manager_Namefull_nm

我尝试了以下但我不确定如何调用该函数

def mgr1(row):
    for row in df['mgr_emp_id']:
        if row['mgr_emp_id'] == row['emp_id']:
            df['Manager Name']=row['full_nm']

我试着这样称呼它:

df.apply(lambda row: mgr1(row),axis=1)

但我收到一个错误:

TypeError:“浮动”对象不可下标

如果有更好的方法来实现我想要做的事情,请提供任何帮助:)

标签: pythonpandasmerge

解决方案


如果我正确理解了您的问题,那么您希望为每个匹配的 id 实例“创建一个新列”就会感到困惑。大概您想要的是一个名为“管理名称”的附加列,如果emp_id匹配mgr_emp_id,您希望full_nm等于“管理名称”。显然,如果存在不平等,您将不知道管理名称。

要实现这一点,您可以简单地创建一个新的 NAN 值列,过滤emp_id匹配的行mgr_emp_id,并用该行的值替换这些行的 NAN 值full_nm

df = pd.DataFrame([
    [65391, 'Pierric.Beckert@email.com', 'Pierric Beckert', 57834],
    [65392, 'Mat.Yokoyama@email.com', 'Mat Yokoyama', 92499],
    [65393, 'Kevin.Harvey@email.com', 'Kevin Harvey', 45325],
    [11111, 'example.same@email.com', 'Example Same', 11111]],
    columns=['emp_id', 'email_ad', 'full_nm', 'mgr_emp_id'])

df['manager_name'] = np.nan

df.loc[df.emp_id.eq(df.mgr_emp_id), 'manager_name'] = df.full_nm

在最后一行中,我们用于loc查找emp_id匹配的行mgr_emp_id和感兴趣的列(“manager_name”),并将值输入到该数据框元素中,替换 NAN。

结果是:

    emp_id  email_ad                    full_nm         mgr_emp_id  manager_name
0   65391   Pierric.Beckert@email.com   Pierric Beckert 57834       NaN
1   65392   Mat.Yokoyama@email.com      Mat Yokoyama    92499       NaN
2   65393   Kevin.Harvey@email.com      Kevin Harvey    45325       NaN
3   11111   example.same@email.com      Example Same    11111       Example Same

如果你想做任何不同的事情,我想你会想要单独的数据框或不同形状的数据框。


推荐阅读