【问题标题】:How to merge pandas dataframes while removing rows from first dataframe which have the same index?如何在从具有相同索引的第一个数据帧中删除行的同时合并熊猫数据帧?
【发布时间】:2017-11-23 14:46:51
【问题描述】:

假设我有 2 个数据帧,df1 和 df2

subject_id first_name last_name        
1                Alex  Anderson
2                 Amy  Ackerman
3               Allen       Ali
4               Alice      Aoni
5              Ayoung   Atiches

subject_id first_name last_name
4               Billy    Bonder
5               Brian     Black
6                Bran   Balwner
7               Bryce     Brice
8               Betty    Btisan

假设他们的索引是subject_id,我怎样才能得到以下:

subject_id first_name last_name        
1                Alex  Anderson
2                 Amy  Ackerman
3               Allen       Ali
4               Billy    Bonder
5               Brian     Black
6                Bran   Balwner
7               Bryce     Brice
8               Betty    Btisan

当我在这的时候,如何得到这个:

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

【问题讨论】:

    标签: python pandas join dataframe merge


    【解决方案1】:

    使用combine_first,如有必要,请先使用set_index

    df11 = df1.set_index('subject_id')
    df22 = df2.set_index('subject_id')
    
    df3 = df22.combine_first(df11).reset_index()
    print (df3)
       subject_id first_name last_name
    0           1       Alex  Anderson
    1           2        Amy  Ackerman
    2           3      Allen       Ali
    3           4      Billy    Bonder
    4           5      Brian     Black
    5           6       Bran   Balwner
    6           7      Bryce     Brice
    7           8      Betty    Btisan
    
    df3 = df11.combine_first(df22).reset_index()
    print (df3)
       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
    

    【讨论】:

    • 哇,这就像一个魅力。一直以来我都在查看合并,正如@Wen 提到的连接然后删除重复项,但我知道有更多 Pythonic 方法可以做到这一点。谢谢大佬
    • @Wen - 是的,它有时会发生。
    【解决方案2】:

    我们可以使用pd.concatdrop_duplicates,(抱歉好像是这样,隐藏它们的格式....,这会使答案难看...)

    pd.concat([df1,df2]).drop_duplicates('subject_id',keep='first')

    Out[95]: 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 pd.concat([df1,df2]).drop_duplicates('subject_id',keep='last')

    Out[96]: subject_id first_name last_name 0 1 Alex Anderson 1 2 Amy Ackerman 2 3 Allen Ali 0 4 Billy Bonder 1 5 Brian Black 2 6 Bran Balwner 3 7 Bryce Brice 4 8 Betty Btisan

    【讨论】:

    • 是的,这就是我尝试过的方式,但我正在寻找一个班轮,@jezrael 给出了一个很好的答案。无论如何谢谢:)
    • @mrGreenBrown 好的,让我看看时间。
    • @mrGreenBrown 似乎先合并是正确的方法,但它有点慢......
    • @Wen:要恢复格式按钮,您可能需要删除浏览器缓存。在 Firefox 上,转到 History > Clear Recent History。然后当你重新加载 SO 页面时,会重新加载正确的辅助文件。
    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 2020-11-02
    • 2021-11-20
    • 2020-10-15
    • 2020-02-21
    • 2016-07-31
    • 2019-05-14
    相关资源
    最近更新 更多