2017-01-01 6 views
2

Ich versuche, einen Datenrahmen (z. B. df3) zu erstellen, die Gehaltsinformationen auf Personen Namen überschreibt. Ich arbeite derzeit mit df1 mit einer Liste von rund 1.000 Namen. Hier ist ein Beispiel dafür, wie df1 aussieht.Mapping mehrere Spalten zu einem einzigen Datenrahmen mit Pandas

print df1.head() 

       Salary 
    Name  
    Joe Smith 8700 
    Jane Doe 6300 
    Rob Dole 4700 
    Sue Pam 2100 
    Jack Li 3400 

Ich habe auch df2, die zufällig Menschen aus df1 entweder als Kapitän und Skipper Spalten zuweist.

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 

Wie kann ich die Namen in df2 mit ihren entsprechenden Gehälter ersetzen, so dass ich genau dieses Format unten haben. In Excel würde ich eine SVERWEIS-Funktion verwenden, aber ich bin mir nicht sicher, wie dies mit Python zu erreichen ist.

print df3.head() 

    Captain Skipper 
    2100  8700 
    6300  2100 
    4700  8700 
    8700  2100 
    4700  3400 

Antwort

1

könnten Sie df2[col].map(df1['Salary']) verwenden, um jede Spalte von df2 nach df1['Salary'] zur Karte:

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) 

ergibt

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

Schön, danke! – HelloMello27

1

Sie das Gehalt in df1 mit df1.loc[name, 'Salary'] für jeden Namen nachschlagen kann. Mit .applymap(), können Sie dies für alle Einträge in allen Spalten von df2 tun:

df3 = df2.applymap(lambda x: df1.loc[x, 'Salary']) 
print(df3) 

Ergebnis:

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

Arbeitete auch. Vielen Dank! – HelloMello27

1

ich das mit stack kombiniert pd.Series.map Funktion nutzen würde df2 eine Serie zu machen. Dann unstack zurück.

  • stackdf2 es
  • Verwendung map mit df1.Salary
  • unstack Ihre Datenrahmen

df2.stack().map(df1.Salary).unstack() 

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

Hat super funktioniert. Vielen Dank! – HelloMello27

0

dataframe.replace Methode besser geeignet ist Nachschlag als zu tun, um wieder eine Serie zu machen.

>>> 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 
Verwandte Themen