使用pandas将多个列映射到单个数据帧

时间:2017-01-01 21:24:05

标签: python pandas

我正在尝试创建一个数据框(例如,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

4 个答案:

答案 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)

您可以使用df1df1.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使其成为一个系列
  • mapdf1.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