2016-01-12 23 views
2

我有兩個數據幀(df1和df2),我打算根據df1中的列'pin','pin1',pin2'合併df1和df2在df2中列'pincode2'。數據幀的多重合並,無需替換值

結構:

   df1        df2 

ID Name pin pin1 pin2 pin3   pincode value 
1 A1 1001 4521 3223 6433   1001  W1 
2 A5 1002  4556     1002  O1 
3 X3 4531 4341  4563   1003  X3 
4 A4 4633 4633 4633 4633   1004  Z2 
5 B3 5346    3452   1005  Y9 
6 B4 1001        1006  G4 
7 F5    6512     1007  R3 

現在,我使用下面的代碼執行大熊貓合併:

# Importing libraries 

import pandas as pd 
import cvs as csv 
#********************************************************************# 

# Importing the files 

df1= pd.read_csv('/Users/one/Input/df1.csv', encoding = "ISO-8859-1") 
df2= pd.read_csv('/Users/one/Input/df2.csv', encoding = "ISO-8859-1") 

#*************************************************************# 

# Creating a column as a flag 

df1['mapping_type']= 'Unmapped' 

#*************************************************************# 

# Merging/Joining the two data frame 

df_first_run = pd.merge(left=df1, right=df2, left_on= 'pin', right_on= 'pincode', how='left') 

正如你所看到的,我需要重複這個合併與列「PIN1 ''pin1'的df1。不過,我不想繼續更改列名稱df2,否則我會替換先前獲得的值。

此外,mapped_type列必須更改以顯示映射了哪個列。

Expected Output: 

    ID Name pin pin1 pin2 pin3 value mapping_type 
    1 A1 1001 4521 3223 6433 W1  pin 
    2 A5 1002  4556   O2  pin 
    3 X3 4531 4341  4563 P3  pin3 
    4 A4 4633 4633 4633 4633 Q2  pin2 
    5 B3 5346    3452   Unmapped 
    6 B4 1001      W1  pin 
    7 F5    6512   Q2  pin2 

回答

1

您可以使用map函數來代替合併。

只需將df2轉換爲散列並分別映射每個系列。

mapping = df2.to_dict()['value'] 
for col in ['pin', 'pin1', 'pin2', 'pin3']: 
    df1['{}_value'.format(col)] = df1[col].map(mapping) 

這將與您的示例數據產生此:

Name pin pin1 pin2 pin3 pin_value pin1_value pin2_value pin3_value 
ID                   
1 A1 1001 4521 3223 6433  W1  NaN  NaN  NaN 
2 A5 1002 4556 NaN NaN  O1  NaN  NaN  NaN 
3 X3 4531 4341 4563 NaN  NaN  NaN  NaN  NaN 
4 A4 4633 4633 4633 4633  NaN  NaN  NaN  NaN 
5 B3 5346 3452 NaN NaN  NaN  NaN  NaN  NaN 
6 B4 1001 NaN NaN NaN  W1  NaN  NaN  NaN 
7 F5 6512 NaN NaN NaN  NaN  NaN  NaN  NaN 

這不正是你問什麼,但也許不夠好。

如果你想擁有你問什麼了,它變得有點複雜:

mapping = df2.to_dict()['value'] 
for col in ['pin', 'pin1', 'pin2', 'pin3']: 
    mappedvalues = df1[col].map(mapping) 
    hasmapping = pd.notnull(mappedvalues) 
    df1.loc[hasmapping, 'value'] = mappedvalues 
    df1.loc[hasmapping, 'mapping'] = col 

給人

Name pin pin1 pin2 pin3 value mapping 
ID            
1 A1 1001 4521 3223 6433  W1  pin 
2 A5 1002 4556 NaN NaN  O1  pin 
3 X3 4531 4341 4563 NaN NaN   
4 A4 4633 4633 4633 4633 NaN   
5 B3 5346 3452 NaN NaN NaN   
6 B4 1001 NaN NaN NaN  W1  pin 
7 F5 6512 NaN NaN NaN NaN   

但是,應該注意的是,最後一欄更改值將是'映射'中提到的列。這感覺像不好的做法,我可能會與上面的例子。

+0

首先讓我說非常感謝你回答這個問題,我同意你的方法和建議選擇第一個,我只有兩個疑問,1.是否可以將映射保存爲數據框以便導出它。 2.我可以映射兩列,即'value'和'value1' –

+0

@ user3875610,您可以通過簡單地寫'df.to_csv('filename.csv')'來保存數據幀。至於映射兩列,當然,但你想要列映射到什麼?你應該更新你的問題。 – firelynx

+0

瞭解,其實我覺得我很滿意這個答案。感謝您的幫助 –