2017-01-01 48 views
2

我正在尝试创建一个覆盖工资信息到人名的数据框(例如,df3)。我目前正在与df1合作,列出大约1,000个名字。以下是df1的一个例子。用pandas将多个列映射到单个数据框

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 

回答

1

你可以使用df2[col].map(df1['Salary'])根据df1['Salary']df2每一列映射:

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) 

产生

Captain Skipper 
0  2100  8700 
1  6300  2100 
2  4700  8700 
3  8700  2100 
4  4700  3400 
+0

美丽,谢谢! – HelloMello27

1

您可以df1.loc[name, 'Salary']查找薪水每个名字df1。 使用.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 
+0

工作,以及。谢谢! – HelloMello27

1

我会充分利用pd.Series.map功能与stack相结合,使df2一个系列。然后unstack回来。

  • stackdf2df1.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 
+0

工作很好。谢谢! – HelloMello27

0

dataframe.replace方法比做查找更适合使它一系列

  • 使用map

    >>> 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 
    
  • 相关问题