2016-07-29 87 views
2

我有兩個dataframes dfdf2這樣如何比較熊貓中兩個數據框的值?

id initials 
0 100 J 
1 200 S 
2 300 Y 

    name initials 
0 John J 
1 Smith S 
2 Nathan N 

我要比較在(dfdf2)中發現的initials列中的值複製名稱(df2),它最初是匹配的在第一數據幀初始(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任何在「ID」列。

如果你不想在那裏粘性的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] 

df1刪除initials柱:

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