我有两个数据框(df1 和 df2),我计划根据 df1 中 df2 中的 'pincode2' 列上的列 'pin'、'pin1'、pin2' 合并 df1 和 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
现在我正在使用以下代码在 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
最佳答案
您可以使用 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
但是,需要注意的是,最后更改值的列将是“映射”中提到的列。这感觉像是不好的做法,我可能会使用上面的示例。
关于python - 在不替换值的情况下多次合并数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34738012/