python - 在不替换值的情况下多次合并数据框

标签 python pandas merge

我有两个数据框(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/

相关文章:

python - 将 numpy 整数数组转换为 12 位二进制

python - 返回pandas DataFrame列的最大值为零或值

python - Pandas 如何根据所有行的值向数据框添加新列,特定列值应用于整个数据框

opencv - 无法使用 cvMerge、DFT 进行转换

sql - 如何根据 PostgreSQL 中的行差异有条件地合并行?

python - 用python或其他语言生成Dex文件

python - 在 Python 中对日期进行排序

python - 停止在 nao 机器人上运行的 Python 脚本触摸他的头

python - 如何统计数据框中每个值出现的频率?

svn - git-svn 能否正确填充 svn :mergeinfo properties?