根据特定列,从一个数据框中删除在另一个数据框中存在的行。
根据特定列,从一个数据框中删除在另一个数据框中存在的行。
我有两个如下所示的数据框:\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我想根据列A
和B
从df1
中删除仅在df2
中存在的行。从df1
中,值0和45以及4和30在df2
的列A
和B
中存在。所以我想删除df1
中的整行。最终的数据框应该如下所示:\n
final = A B val1 val2 val3 0 3 100 10 80 50 1 6 150 50 34 11
\n最终数据框的索引应该重置为0和1\n有办法做到这一点吗?
在这段代码中,问题的出现是要从一个数据框中删除存在于另一个数据框中的行,具体取决于特定的列。解决方法有两种。
第一种解决方法是通过筛选出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
以上是解决在一个数据框中删除存在于另一个数据框中的行的两种方法。