2017-09-29 5 views
1

Ich habe zwei Datenrahmen, eine, die Autoren und ihre Texte hat - es gibt auch andere Spalten - und eine andere, die Autoren und ihre Geschlechter und Disziplinen hat.Übereinstimmende Daten über Pandas Datenrahmen

DF1 
==================================== 
author date text 
------------------------------------ 
a1  2006 "Thank you for..." 
a2  2007 "When I was asked..." 
a3  2014 "Biology is the ..." 
a2  2010 "In the intervening..." 

DF2 
==================================== 
author gender discipline 
------------------------------------ 
a2  male  psychologist 
a1  female neurologist 
a3  female biologist 

Ich Schrubbe durch die pandas Dokumentation und die Suche SO und andere Websites versuchen, zu sehen, wie ich Autoren in DF1 mit ihren Geschlechtern in DF2 mithalten kann. Es ist mir egal, ob ich es in DF1 anstelle oder wenn ich einen neuen Datenrahmen erstellen muss, solange der neue Datenrahmen alle Informationen in DF1 plus die zusätzlichen Informationen, Geschlecht und/oder Disziplin, von DF2 enthält.

Ich habe nicht einmal die Anfänge des Codes hier - ich habe gerade fertig mit Scrollen von DF2 aller Arten von Unicode-Fehlern, so bin ich ein bisschen am Ende des Witzes zu diesem Zeitpunkt des Tages.

Antwort

1

Option 1
pd.DataFrame.merge

DF1.merge(DF2[['author', 'gender']], 'left') 

    author date      text gender 
0  a1 2006  "Thank you for..." female 
1  a2 2007 "When I was asked..." male 
2  a3 2014  "Biology is the ..." female 
3  a2 2010 "In the intervening..." male 

Option 2
pd.Series.map

d = dict(DF2[['author', 'gender']].values) 
DF1.assign(gender=DF1.author.map(d)) 

    author date      text gender 
0  a1 2006  "Thank you for..." female 
1  a2 2007 "When I was asked..." male 
2  a3 2014  "Biology is the ..." female 
3  a2 2010 "In the intervening..." male 

Optio n 2,1
andere Möglichkeiten, um die d

d = DF2.set_index('author').gender 
DF1.assign(gender=DF1.author.map(d)) 

    author date      text gender 
0  a1 2006  "Thank you for..." female 
1  a2 2007 "When I was asked..." male 
2  a3 2014  "Biology is the ..." female 
3  a2 2010 "In the intervening..." male 

Option 2.2
andere Weise zu machen, um die d

d = dict(zip(DF2.author, DF2.gender)) 
DF1.assign(gender=DF1.author.map(d)) 

    author date      text gender 
0  a1 2006  "Thank you for..." female 
1  a2 2007 "When I was asked..." male 
2  a3 2014  "Biology is the ..." female 
3  a2 2010 "In the intervening..." male 

Option 3
pd.DataFrame.join

DF1.join(DF2.set_index('author').gender, on='author') 

    author date      text gender 
0  a1 2006  "Thank you for..." female 
1  a2 2007 "When I was asked..." male 
2  a3 2014  "Biology is the ..." female 
3  a2 2010 "In the intervening..." male 
+0

Große googly Moogly! Drei Optionen in einer Antwort! Lass mich das mit den Live-Daten versuchen und ich melde mich bei dir. –

+0

Ich rufe Sie jetzt auf, aber ich kann nicht bestätigen, dass dies die Antwort ist. Ich bekomme 'KeyError: '[' author '] nicht in Index" 'sowohl in Option 1 als auch in Version 2.1. Und ich bin mir ziemlich sicher, dass ich zu diesem Zeitpunkt des Tages einfach zu müde bin, um zu sehen, was ich falsch mache. Danke Danke. Ich werde es am Morgen gerne wiederholen und den Scheck geben, wenn das zusammenkommt. –

+0

Das bedeutet, "Autor" ist kein Spaltenname in einem der Datenrahmen. Dies passiert oft, wenn Sie die Daten analysieren und Sie erhalten Dinge wie "Autor" mit einem zufälligen Leerzeichen in der Kopfzeile. Überprüfen Sie, ob dies bei 'DF1.columns' oder' DF2.columns' der Fall ist. Du solltest etwas wie "Autor" sehen. Wenn dies der Fall ist, können Sie es mit 'DF1.columns = DF1.columns.str.strip()' – piRSquared

1
import pandas as pd 

df = pd.DataFrame({'author':['a1','a2','a3','a2'], 
          'date':[2006,2007,2014,2010], 
          'text':["Thank you for","when i was asked","i m the biology","in the intervening"]}) 


df2 = pd.DataFrame({'author':['a2','a1','a3'], 
        'gender':['male','female','female'], 
        'disciple':['pyshologist','neurologist','biologist']}) 




print(pd.merge(df,df2, on = 'author')) 
Verwandte Themen