【发布时间】:2019-09-19 11:24:46
【问题描述】:
我有两个数据框。我需要从右侧(第二个)数据库中获取一个值,并将其作为一个列添加到左侧(第一个)数据帧中,基于两个数据帧中存在的其他两个列。这样做时,我需要在左侧数据框中为该列指定一个与在右侧数据框中调用的名称不同的名称。
我排除了merge和join,因为数据框有数百列,我只需要带上一列,这样做时我还需要更改列名。相反,我正在尝试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