【问题标题】:How to lookup and bring in a value from another dataframe based on values in two columns如何根据两列中的值从另一个数据框中查找和引入值
【发布时间】:2019-09-19 11:24:46
【问题描述】:

我有两个数据框。我需要从右侧(第二个)数据库中获取一个值,并将其作为一个列添加到左侧(第一个)数据帧中,基于两个数据帧中存在的其他两个列。这样做时,我需要在左侧数据框中为该列指定一个与在右侧数据框中调用的名称不同的名称。

我排除了mergejoin,因为数据框有数百列,我只需要带上一列,这样做时我还需要更改列名。相反,我正在尝试map它。

例如:

import pandas as pd
emp_data = {
            'Name':['Tom', 'Tom', 'Steve', 'Steve'],
            'Age':[28,34,29,42], 
            'Job':['Engineer', 'Coordinator', 'Analyst', 'Manager']
            }

emps = pd.DataFrame(emp_data)
print(emps)

pay_data = {
            'Name':['Tom', 'Tom', 'Steve', 'Steve'],
            'Age':[28,34,29,42], 
            'Salary':[80, 50, 70, 100]
            }

pay = pd.DataFrame(pay_data)
print(pay)

keys = ['Name', 'Age']
emps['Pay'] = emps[keys].map(pay.set_index(keys)['Salary'])

因此,我希望 emps 数据框有 4 列:姓名、年龄、工作和薪酬。 “Pay”列将包含pay 数据框中“Salary”列中的数据,并将根据姓名和年龄进行映射。

相反,代码给了我一个错误:

AttributeError: 'DataFrame' 对象没有属性 'map'

但是,当我将代码更改为基于一个值进行映射(首先使值唯一)时,代码可以工作。

import pandas as pd
emp_data = {
            'Name':['Tom', 'Bill', 'Steve', 'John'],
            'Age':[28,34,29,42], 
            'Job':['Engineer', 'Coordinator', 'Analyst', 'Manager']
            }

emps = pd.DataFrame(emp_data)
print(emps)

pay_data = {
            'Name':['Tom', 'Bill', 'Steve', 'John'],
            'Age':[28,34,29,42], 
            'Salary':[80, 50, 70, 100]
            }

pay = pd.DataFrame(pay_data)
print(pay)


emps['Pay'] = emps['Name'].map(pay.set_index('Name')['Salary'])
print(emps)

输出:

    Name  Age          Job  Pay
0    Tom   28     Engineer   80
1   Bill   34  Coordinator   50
2  Steve   29      Analyst   70
3   John   42      Manager  100

所以,我正试图找出真正的问题是什么以及如何解决它。任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • @Erfan,我给出的例子只是为了给出一个想法。我的真实数据框有数百列。合并带来所有列并保留它们的名称。我只需要从数百人中挑选一个并在此过程中更改其名称。
  • 这仍然是一个合并,只需将你需要的两列带过来。例如emps.merge(pay[['pay', 'anothercolumn']], on=['Name', 'Age'])
  • emps.merge(pay[['Name', 'Age', 'Salary']], on=['Name', 'Age']).rename(columns={'Salary':'Pay'})
  • 我如何用不同的名字把它们带过来?
  • 重命名使用df.rename({'Pay':'new name'}, axis=1, inplace=True)

标签: python pandas dataframe mapping vlookup


【解决方案1】:

由于您的索引必须位于两列上,因此您不能使用 map。相反,您必须按照 Erfan 和 It_is_Chris 的建议使用合并。

适用于此的合并代码是:

emps.merge(pay[['Name', 'Age', 'Salary']], on=['Name', 'Age']).rename(columns={'Salary':'Pay'})

另一个选项是使用 combine_first。但是,它存在一些挑战,因为组合不会产生正确的值。最好的选择仍然是合并。

如果你想试试,可以看combine_first option

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-18
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多