多个合并数据框而不替换值

时间:2016-01-12 07:42:04

标签: python pandas merge

我有两个数据帧(df1和df2),我打算根据列'pin','pin1',pin2'合并df1和df2,它们位于df2中'pincode2'列的df1中。

结构:

              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

现在我使用以下代码在pandas中执行合并:

# 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')

如您所见,我需要使用df1的'pin1''pin2'列重复此合并。但是我不想继续更改列名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 个答案:

答案 0 :(得分: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'中提到的列。这感觉就像是不好的做法,我可能会选择上面的例子。