根据特定列,从一个数据框中删除在另一个数据框中存在的行。

18 浏览
0 Comments

根据特定列,从一个数据框中删除在另一个数据框中存在的行。

我有两个如下所示的数据框:\n

df1 =
      A     B    val1     val2   val3
0     0    45     20      200      100       
1     3    100    10      80       50      
2     4    30     30      60       10  
3     6    150    50      34       11

\n

df2 =
      A     B    val1     val2   val3
0     4    30     80      145      90      
1     0    45     10      80       50      
2     1    78     10      90       18  

\n我想根据列ABdf1中删除仅在df2中存在的行。从df1中,值0和45以及4和30在df2的列AB中存在。所以我想删除df1中的整行。最终的数据框应该如下所示:\n

final = 
      A     B    val1     val2   val3
0     3    100    10      80       50        
1     6    150    50      34       11

\n最终数据框的索引应该重置为0和1\n有办法做到这一点吗?

0
0 Comments

在这段代码中,问题的出现是要从一个数据框中删除存在于另一个数据框中的行,具体取决于特定的列。解决方法有两种。

第一种解决方法是通过筛选出df2的列名,并在DataFrame.merge函数中添加indicator参数,并使用左连接。然后通过测试列_merge并使用boolean indexing进行筛选。最后使用DataFrame.reset_index函数重置索引。代码如下:

df = (df1[df1.merge(df2[['A','B']], indicator=True, how='left')['_merge'].eq('left_only')]
         .reset_index(drop=True))
print (df)
   A    B  val1  val2  val3
1  3  100    10    80    50
3  6  150    50    34    11

第二种解决方法是创建一个MultiIndex,并使用Index.isin函数与反转的掩码进行筛选。代码如下:

df = (df1[~df1.set_index(['A','B']).index.isin(df2.set_index(['A','B']).index)]
           .reset_index(drop=True)))
print (df)
   A    B  val1  val2  val3
1  3  100    10    80    50
3  6  150    50    34    11

以上是解决在一个数据框中删除存在于另一个数据框中的行的两种方法。

0