汇总2个数据帧,其中第一个键不在另一个中

时间:2017-11-03 17:09:35

标签: pandas numpy

我有2个数据帧..

raw_data = {
        'subject_id': ['1', '2', '3', '4', '5'],
        'first_name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'], 
        'last_name': ['Anderson', 'Ackerman', 'Ali', 'Aoni', 'Atiches']}
df_a = pd.DataFrame(raw_data, columns = ['subject_id', 'first_name', 'last_name'])
df_a

    raw_data = {
        'subject_id': ['4', '5', '6', '7', '8'],
        'first_name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 
        'last_name': ['Bonder', 'Black', 'Balwner', 'Brice', 'Btisan']} df_b = pd.DataFrame(raw_data, columns = ['subject_id', 'first_name', 'last_name'])
df_b

我想要输出如下..

 subject_id first_name last_name
0          1       Alex  Anderson
1          2        Amy  Ackerman
2          3      Allen       Ali
3          4      Alice      Aoni
4          5     Ayoung   Atiches
2          6       Bran   Balwner
3          7      Bryce     Brice
4          8      Betty    Btisan

我希望连接df_a的所有记录,只连接df_b中不在df_a中的那些记录。

我可以通过以下代码执行此操作。

    import pandas as pd
    import numpy as np

mask=np.logical_not(df_b['subject_id'].isin(df_a['subject_id']))
    pd.concat([df_a,df_b.loc[mask]])

在函数concat和merge中是否还有其他简短方法可用。 请帮忙..

2 个答案:

答案 0 :(得分:2)

您可以将combine_first与set_index()

一起使用
new_df = df_a.set_index('subject_id').combine_first(df_b.set_index('subject_id'))\
.reset_index()

    subject_id  first_name  last_name
0   1           Alex        Anderson
1   2           Amy         Ackerman
2   3           Allen       Ali
3   4           Alice       Aoni
4   5           Ayoung      Atiches
5   6           Bran        Balwner
6   7           Bryce       Brice
7   8           Betty       Btisan

答案 1 :(得分:1)

drop_duplicates默认保留重复对的第一个

pd.concat([df_a,df_b]).drop_duplicates(['subject_id'])
Out[1015]: 
  subject_id first_name last_name
0          1       Alex  Anderson
1          2        Amy  Ackerman
2          3      Allen       Ali
3          4      Alice      Aoni
4          5     Ayoung   Atiches
2          6       Bran   Balwner
3          7      Bryce     Brice
4          8      Betty    Btisan