2017-09-15 5 views
0

Ich versuche, für einen Datenrahmen von einem anderen einen 'einfachen' Nachschlag von fehlenden Werten zu tun:Pandas Datenrahmen merge Lookup - mehrere Spalten in Folge

somedict = {'col1':['a1','b2','c3','d4','d5','d6'], 'Col2':['a','b','c','b','e','a'], 'Col3':[33,56,74,55,99,86], 'Col4':['','',3,'',5,'']} 
dfa = pd.DataFrame(somedict) 

und

otherdic = {'Col2':['a','b'], 'Col4':['NEW', 'ALSONEW']} 
dfb = pd.DataFrame(otherdic) 

so erhalten ich dfb und DFA:

Col2 Col4 
0 a NEW 
1 b ALSONEW 

Col2 Col3 Col4 col1 
0 a  33   a1 
1 b  56   b2 
2 c  74  3 c3 
3 b  55   d4 
4 e  99  5 d5 
5 a  86   d6 

was ich suche ist

Col2 Col3 Col4 col1 
0 a  33  NEW a1 
1 b  56 ALSONEW b2 
2 c  74  3 c3 
3 b  55 ALSONEW d4 
4 e  99  5 d5 
5 a  86  NEW d6 

Ich habe versucht:

pd.merge(dfa, dfb, on='Col2', how='left') 

die liefert

Col2 Col3 Col4_x col1 Col4_y 
0 a  33    a1 NEW 
1 b  56    b2 ALSONEW 
2 c  74   3  c3 NaN 
3 b  55    d4 ALSONEW 
4 e  99   5  d5 NaN 
5 a  86    d6 NEW 

Bin ich eine falsche Annahme, dass fusionieren sollte 'wissen', dass Spalten Col4 Spiel in Namen?
Jede Hilfe wird geschätzt. Vielen Dank.

Antwort

1

Eine Möglichkeit, ersetzen Col4 Rohlinge '' mit dfb Mapping auf Col2 mit Col4.

In [499]: dfa.loc[dfa['Col4']=='', 'Col4'] = dfa['Col2'].map(dfb.set_index('Col2')['Col4']) 

In [500]: dfa 
Out[500]: 
    Col2 Col3  Col4 col1 
0 a 33  NEW a1 
1 b 56 ALSONEW b2 
2 c 74  3 c3 
3 b 55 ALSONEW d4 
4 e 99  5 d5 
5 a 86  NEW d6 

Einzelheiten

In [485]: mapping = dfb.set_index('Col2')['Col4'] 

In [486]: mapping 
Out[486]: 
Col2 
a  NEW 
b ALSONEW 
Name: Col4, dtype: object 

In [487]: dfa['Col2'].map(mapping) 
Out[487]: 
0  NEW 
1 ALSONEW 
2  NaN 
3 ALSONEW 
4  NaN 
5  NEW 
Name: Col2, dtype: object 

In [488]: dfa.loc[dfa['Col4'] == '', 'Col4'] = dfa['Col2'].map(mapping) 

In [489]: dfa 
Out[489]: 
    Col2 Col3  Col4 col1 
0 a 33  NEW a1 
1 b 56 ALSONEW b2 
2 c 74  3 c3 
3 b 55 ALSONEW d4 
4 e 99  5 d5 
5 a 86  NEW d6 
+0

Danke für die Schule, John! Ich fühle mich wie ein Kleinkind, das mit Fitzpatrick spricht. – johnaco

0
new = dfa.Col4.mask(
    dfa.Col4.eq(''), 
    dfa.Col2.map(dict(dfb.values)) 
) 
dfa.assign(Col4=new) 

    Col2 Col3  Col4 col1 
0 a 33  NEW a1 
1 b 56 ALSONEW b2 
2 c 74  3 c3 
3 b 55 ALSONEW d4 
4 e 99  5 d5 
5 a 86  NEW d6 
+0

Funktioniert auch gut. Danke piRSquared! – johnaco

Verwandte Themen