假設我有兩個資料框
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相同值的行ABdf2
我這樣做是通過
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
我想知道是否有更簡單/更快的方法來做到這一點,特別是如果資料框很大,那么迭代所有行并不理想。
uj5u.com熱心網友回復:
您可以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
uj5u.com熱心網友回復:
這是另一種方式:
df1.loc[~df1.set_index(['A','B']).index.isin(df2.to_records(index=False).tolist())]
uj5u.com熱心網友回復:
#!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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/464363.html
