如何从另一个pandas数据框中减去行?

发布于 2021-01-29 17:40:59

我要执行的操作类似于合并。例如,通过inner合并,我们得到一个数据帧,其中包含第一个AND第二个数据帧中存在的行。通过outer合并,我们得到一个数据帧,该数据帧在第一个或第二个数据帧中都存在。

我需要的是一个数据帧,其中包含第一个数据帧中存在的行而第二个数据帧中不存在的行?有快速而优雅的方法吗?

关注者
0
被浏览
61
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如下所示呢?

    print df1
    
        Team  Year  foo
    0   Hawks  2001    5
    1   Hawks  2004    4
    2    Nets  1987    3
    3    Nets  1988    6
    4    Nets  2001    8
    5    Nets  2000   10
    6    Heat  2004    6
    7  Pacers  2003   12
    
    print df2
    
        Team  Year  foo
    0  Pacers  2003   12
    1    Heat  2004    6
    2    Nets  1988    6
    

    只要有一个非关键的通用命名列,就可以让在sufffexes上执行的工作(如果没有非关键的通用列,则可以创建一个临时使用…df1['common'] = 1df2['common'] = 1):

    new = df1.merge(df2,on=['Team','Year'],how='left')
    print new[new.foo_y.isnull()]
    
         Team  Year  foo_x  foo_y
    0  Hawks  2001      5    NaN
    1  Hawks  2004      4    NaN
    2   Nets  1987      3    NaN
    4   Nets  2001      8    NaN
    5   Nets  2000     10    NaN
    

    或者您可以使用,isin但是您必须创建一个密钥:

    df1['key'] = df1['Team'] + df1['Year'].astype(str)
    df2['key'] = df1['Team'] + df2['Year'].astype(str)
    print df1[~df1.key.isin(df2.key)]
    
         Team  Year  foo         key
    0   Hawks  2001    5   Hawks2001
    2    Nets  1987    3    Nets1987
    4    Nets  2001    8    Nets2001
    5    Nets  2000   10    Nets2000
    6    Heat  2004    6    Heat2004
    7  Pacers  2003   12  Pacers2003
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看