我有两个数据帧(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
答案 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'中提到的列。这感觉就像是不好的做法,我可能会选择上面的例子。