2016-01-12 6 views
2

У меня есть два кадра данных (df1 и df2), я планирую объединить df1 и df2 на основе столбцов 'pin', 'pin1', pin2 ', которые находятся в df1 on столбец «pincode2» в df2.Несколько слияний кадра данных без замены значений

Состав:

   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 '' pin2 '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

Вы можете использовать функцию карты вместо слияния.

Просто превратите 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   

Однако, следует отметить, что последний столбец, чтобы изменить значением будет столбец, упомянутый в «mapping». Это похоже на плохую практику, и я, вероятно, поеду с приведенным выше примером.

+0

Прежде всего позвольте мне поблагодарить вас за это, я согласен с вашим подходом и предложением выбрать первый вариант, у меня есть только два сомнения: 1. Можно ли сохранить отображение в качестве фрейма данных, чтобы экспортировать Это. 2. Могу ли я сопоставить два столбца. Скажем, «value» и «value1» –

+0

@ user3875610 вы можете сохранить данные, просто написав 'df.to_csv ('filename.csv')'. Что касается сопоставления двух столбцов, конечно, но для чего вы хотите иметь сопоставленные столбцы? Вы должны обновить свой вопрос. – firelynx

+0

Понял, на самом деле я думаю, что я доволен этим ответом. Спасибо за помощь –

Смежные вопросы