【问题标题】:How two panda data frames with same column values can be merged to form the third data frame that shows the difference of the values如何合并具有相同列值的两个熊猫数据框以形成显示值差异的第三个数据框
【发布时间】:2019-02-12 18:58:34
【问题描述】:

数据框:df1

     name  age  id  salary
0   Smith   30   2    2000
1     Ron   24   3   30000
2    Mike   35   4   40000
3    Jack   21   5    5000
4  Roshan   20   6   60000
5   Steve   45   8    8000
6   Peter   32   1    1000

数据框:df2

    name  age  salary  id
0  Peter   28   10000   1
1  Smith   30    1500   2
2    Ron   24    7000   3
3   Mike   35   20000   4
4   Jack   21    5000   5
5  Cathy   20    9000   6
6  Steve   45   56000   8

df1 和 df2 要在 ID 上合并。请注意,df1 和 df2 中的 ID 不同,但 ID 顺序不同。需要创建如下所示的 df3-

     name       age    id    salary
0   Smith        30     2    2000|1500
1     Ron        24     3    30000|7000
2    Mike        35     4    40000 |20000
3    Jack        21     5    5000
4  Roshan|Cathy  20     6    60000|9000
5   Steve        45     8    8000|56000
6   Peter        32|28  1    1000|10000

我打算使用 to_excel 功能将上述输出放到 excel 表中。在此之前,我想在这个数据框中再添加一个额外的列,上面写着“匹配和不匹配”。逻辑是,如果显示最小一个差值结果的行中的任何一个应该不匹配,否则匹配。我正在模拟下面这样的输出-

id 年龄 姓名 工资 结果 0 2 30 史密斯 2000|1500 不匹配 1 3 24 Ron 30000|7000 不匹配 3 5 21 杰克 5000 比赛 4 6 20 Roshan|Cathy 60000|9000 不匹配 5 8 45 史蒂夫 8000|56000 不匹配 6 1 32|28 彼得 1000|10000 不匹配

我可以用什么来达到这样的结果

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    首先使用merge,然后使用numpy.where按条件连接列,最后仅使用df1.columns过滤列:

    cols = df1.columns.difference(['id'])
    df = df1.merge(df2, on='id', suffixes=('','_'))
    
    s = df[cols].astype(str) + '|' + df[cols + '_'].astype(str).values
    mask = df[cols].values != df[cols + '_'].values
    
    arr =  np.where(mask, s, df[cols].astype(str))
    
    df = df1[['id']].join(pd.DataFrame(arr, columns=cols))
    print (df)
       id    age          name       salary
    0   2     30         Smith    2000|1500
    1   3     24           Ron   30000|7000
    2   4     35          Mike  40000|20000
    3   5     21          Jack         5000
    4   6     20  Roshan|Cathy   60000|9000
    5   8     45         Steve   8000|56000
    6   1  32|28         Peter   1000|10000
    

    【讨论】:

    • 上述解决方案对我来说很顺利。谢谢@jezrael
    猜你喜欢
    • 2020-04-28
    • 2020-06-28
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多