我正在尝试创建一个数据框(例如,df3
),将工资信息覆盖到人名上。我目前正在使用df1,列出大约1,000个名字。这是df1的样子。
print df1.head()
Salary
Name
Joe Smith 8700
Jane Doe 6300
Rob Dole 4700
Sue Pam 2100
Jack Li 3400
我还有df2
,它会随机将df1
的人员分配为队长和船长列。
print df2.head()
Captain Skipper
Sue Pam Joe Smith
Jane Doe Sue Pam
Rob Dole Joe Smith
Joe Smith Sue Pam
Rob Dole Jack Li
如何将df2
中的名称替换为相应的工资,以便我在下面有这样的格式。在excel中,我会使用VLOOKUP函数,但我不确定如何使用Python来实现这一点。
print df3.head()
Captain Skipper
2100 8700
6300 2100
4700 8700
8700 2100
4700 3400
答案 0 :(得分:1)
您可以使用try {
User.create(users, function(err, docs) {
console.log("err: " + err);
console.log("docs: " + docs);
});
} catch (e) {
console.log(e.message);
}
根据df2[col].map(df1['Salary'])
映射df2
的每一列:
df1['Salary']
产量
import pandas as pd
df1 = pd.DataFrame({'Salary':[8700,6300,4700,2100,3400]}, index=pd.Series(['Joe Smith', 'Jane Doe', 'Rob Dole', 'Sue Pam', 'Jack Li'], name='Name'))
df2 = pd.DataFrame({'Captain':['Sue Pam', 'Jane Doe', 'Rob Dole', 'Joe Smith', 'Rob Dole'], 'Skipper': ['Joe Smith', 'Sue Pam', 'Joe Smith', 'Sue Pam', 'Jack Li']})
df3 = pd.DataFrame({col: df2[col].map(df1['Salary']) for col in df2})
print(df3)
答案 1 :(得分:1)
您可以使用df1
在df1.loc[name, 'Salary']
中查找每个姓名的薪水。
使用.applymap()
,您可以对df2
的所有列中的所有条目执行此操作:
df3 = df2.applymap(lambda x: df1.loc[x, 'Salary'])
print(df3)
结果:
Captain Skipper
0 2100 8700
1 6300 2100
2 4700 8700
3 8700 2100
4 4700 3400
答案 2 :(得分:1)
我利用pd.Series.map
功能与stack
相结合,使df2
成为一个系列。然后unstack
回来。
stack
df2
使其成为一个系列map
与df1.Salary
unstack
取回您的数据框df2.stack().map(df1.Salary).unstack()
Captain Skipper
0 2100 8700
1 6300 2100
2 4700 8700
3 8700 2100
4 4700 3400
答案 3 :(得分:0)
dataframe.replace
方法比进行查找更合适。
>>> df1 = pd.DataFrame({'Salary':[8700,6300,4700,2100,3400]}, index=pd.Series(['Joe Smith', 'Jane Doe', 'Rob Dole', 'Sue Pam', 'Jack Li'], name='Name'))
>>> df2 = pd.DataFrame({'Captain':['Sue Pam', 'Jane Doe', 'Rob Dole', 'Joe Smith', 'Rob Dole'], 'Skipper': ['Joe Smith', 'Sue Pam', 'Joe Smith', 'Sue Pam', 'Jack Li']})
>>> df2.replace(df1.Salary)
Captain Skipper
0 2100 8700
1 6300 2100
2 4700 8700
3 8700 2100
4 4700 3400