假设我有两个数据帧
df1 = pd.DataFrame({"A" : [1,1,2,5],
"B" : [1,1,4,5],
"C" : ["Adam","Bella","Charlie","Dan"]})
df2 = pd.DataFrame({"A" : [1,1,3,5],
"B" : [1,3,6,5]})
,我想删除df1
中与df2
具有相同A
和B
值的行
我通过
for i, row_1 in df1.iterrows():
for j, row_2 in df2.iterrows():
if row_1["A"] == row_2["A"] and row_1["B"] == row_2["B"]:
index = i
df1.drop([index], axis=0, inplace=False)
导致,如预期的
A B C
2 2 4 Charlie
我想知道是否有一种更容易/更快的方法来做到这一点,特别是如果数据帧很大,那么迭代所有行是不理想的。
您可以使用left-merge
和indicator
参数标记匹配的行;然后query
来过滤只来自df1
的行:
out = df1.merge(df2, how='left', indicator=True).query('_merge=="left_only"').drop(columns=['_merge'])
输出:
A B C
2 2 4 Charlie
还有另一种方法:
df1.loc[~df1.set_index(['A','B']).index.isin(df2.to_records(index=False).tolist())]
#!pip install siuba
from siuba import anti_join
anti_join(df1, df2, on = ['A', 'B'])
A B C
2 2 4 Charlie
如果您想在所有共享列上设置anti_join
:
anti_join(df1, df2)
A B C
2 2 4 Charlie