根据另一个数据帧的条件删除 pandas 数据帧中的行的更简单方法
Easier way of deleting rows in pandas dataframe based on condition from another dataframe
假设我有两个数据帧
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
中 A
和 B
与 df2
具有相同值的行
我通过
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
我想知道是否有很多 easier/faster 方法可以做到这一点,尤其是当数据框很大时,遍历所有行并不理想。
您可以 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
假设我有两个数据帧
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
中 A
和 B
与 df2
我通过
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
我想知道是否有很多 easier/faster 方法可以做到这一点,尤其是当数据框很大时,遍历所有行并不理想。
您可以 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