2016-07-29 5 views
2

У меня есть два dataframes df и df2 как этоКак сравнить значения двух Dataframes в Pandas?

id initials 
0 100 J 
1 200 S 
2 300 Y 

    name initials 
0 John J 
1 Smith S 
2 Nathan N 

Я хочу, чтобы сравнить значения в initials столбцов, найденных в (df и df2) и скопировать имя (в df2), который его первоначальный сопрягает к начальное в первом dataframe (df)

import pandas as pd 

for i in df.initials: 
    for j in df2.initials: 
     if i == j: 
     # copy the name value of this particular initial to df 

выходной сигнал должен быть таким:

 id name 
0 100 Johon 
1 200 Smith 
2 300 

Любая идея, как решить эту проблему?

ответ

1

Как насчет ?:

df3 = df.merge(df2,on='initials', 
        how='outer').drop(['initials'],axis=1).dropna(subset=['id']) 
>>> df3 
     id name 
0 100.0 John 
1 200.0 Smith 
2 300.0  NaN 

Так столбец «инициалы» отбрасывается, и так что-нибудь с np.nan в колонке «ид».

Если вы не хотите np.nan там липкости на .fillna():

df3 = df.merge(df2,on='initials', 
        how='outer').drop(['initials'],axis=1).dropna(subset=['id']).fillna('') 
>>> df3 
     id name 
0 100.0 John 
1 200.0 Smith 
2 300.0 
2
df1 
    id initials                                        
0 100  J                                        
1 200  S                                        
2 300  Y 

df2 
    name initials                                        
0 John  J                                        
1 Smith  S                                        
2 Nathan  N 

Использование логических масок: df2.initials==df1.initials покажет вам, какие значения в двух столбцах initials одинаковы.

0  True                                          
1  True                                          
2 False 

Используйте эту маску, чтобы создать новый столбец:

df1['name'] = df2.name[df2.initials==df1.initials] 

initials Снимите колонку в df1:

df1.drop('initials', axis=1) 

Замените NaN используя fillna(' ')

df1.fillna('', inplace=True) #inplace to avoid creating a copy 

    id name                                         
0 100 John                                         
1 200 Smith                                         
2 300 
Смежные вопросы