2017-01-01 49 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 
    
  • 相關問題