2017-08-10 2 views
0

私は2つのデータフレームを持っています。最初(df1)には、名前、ID、およびPINが含まれています。 2番目には識別子、都市、国が含まれます。以下のデータフレーム。パンダのデータフレームマージ

df1 = pd.DataFrame({"Name": ["Sam", "Ajay", "Lee", "Lee Yong Dae", "Cai Yun"], "ID": ["S01", "A01", "L02", "L03", "C01"], "PIN": ["SM392", "AA09", "Lee101", "Lee201", "C101"]}) 


df2 = pd.DataFrame({"Identifier": ["Sam", "L02", "C101"], "City": ["Moscow", "Seoul", "Beijing"], "Country": ["Russia", "Korea", "China"]}) 

名前またはIDまたはPINのいずれかがdf2のIDと一致する場合、データフレームをマージしたいと考えています。 City Country Name PIN Student ID 0 Moscow Russia Sam SM392 S01 1 0 0 Ajay AA09 A01 2 Seoul Korea Lee Lee101 L02 3 0 0 Lee Yong Dae Lee201 L03 4 Beijing China Cai Yun C101 C01

+0

は、あなたがより明確にするため所望の出力を表示することができます? – akilat90

+0

をご確認ください。更新しました。 –

答えて

1

これはおそらく、最もエレガントなソリューションではありませんが、それは私のために動作します。 3つの別々のマージを作成し、結果を結合する必要があります。

コードは、以下の(データフレームの比類のない要素のためのNaN値ではなく、0)期待される出力を与える

import numpy as np 
import pandas as pd 

#Initial data 
df1 = pd.DataFrame({"Name": ["Sam", "Ajay", "Lee", "Lee Yong Dae", "Cai Yun"], "ID": ["S01", "A01", "L02", "L03", "C01"], "PIN": ["SM392", "AA09", "Lee101", "Lee201","C101"]}) 

df2 = pd.DataFrame({"Identifier": ["Sam", "L02", "C101"], "City": ["Moscow", "Seoul", "Beijing"], "Country": ["Russia", "Korea", "China"]}) 

def merge_three(df1,df2): 

    #Perform three seperate merges 
    df3=df1.merge(df2, how='outer', left_on='ID', right_on='Identifier') 
    df4=df1.merge(df2, how='outer', left_on='Name', right_on='Identifier') 
    df5=df1.merge(df2, how='outer', left_on='PIN', right_on='Identifier') 

    #Copy 2nd and 3rd merge results to df3 
    df3['City_x']=df4['City'] 
    df3['Country_x']=df4['Country'] 

    df3['City_y']=df5['City'] 
    df3['Country_y']=df5['Country'] 

    #Merge the correct City and Country values. Use max to remove the NaN values 
    df6=df3[['City','Country','Name','PIN','ID']] 
    df6['City']=np.max([df3['City'],df3['City_x'],df3['City_y']],axis=0) 
    df6['Country']=np.max([df3['Country'],df3['Country_x'],df3['Country_y']],axis=0) 

    #Remove extra un-matched rows from merge 
    df_final=df6[df6['Name'].notnull()] 

    return df_final 

df_out = merge_three(df1,df2) 

出力:

df_out 
     City Country   Name  PIN ID 
0 Moscow Russia   Sam SM392 S01 
1  NaN  NaN   Ajay AA09 A01 
2 Seoul Korea   Lee Lee101 L02 
3  NaN  NaN Lee Yong Dae Lee201 L03 
4 Beijing China  Cai Yun C101 C01 
+0

ありがとうございます。よりエレガントなものを探しています。関数を定義することでそれを行うことはできますか? –

+0

関数を定義するための答えを更新しました。 – Andy

0

わからないが、多分これはあなたが探しているものである:予想される出力がある

a = df1.merge(df2, left_on='ID', right_on='Identifier') 
b = df1.merge(df2, left_on='Name', right_on='Identifier') 
с = df1.merge(df2, left_on='PIN', right_on='Identifier') 
df = a.append(b).append(с) 
df 
    ID Name PIN City Country Identifier 
0 L02 Lee Lee101 Seoul Korea L02 
0 S01 Sam SM392 Moscow Russia Sam 
0 C01 Cai Yun C101 Beijing China C101