我有两个DataFrame并想删除df1中的行,其中df2中的“ a”列具有相同的值。而且df2中的一个公共值只会删除一行。
df1 = pd.DataFrame({'a':[1,1,2,3,4,4],'b':[1,2,3,4,5,6],'c':[6,5,4,3,2,1]})
df2 = pd.DataFrame({'a':[2,4,2],'b':[1,2,3],'c':[6,5,4]})
result = pd.DataFrame({'a':[1,1,3,4],'b':[1,2,4,6],'c':[6,5,3,1]})
答案 0 :(得分:3)
使用Series.isin
+ Series.duplicated
创建一个布尔掩码,并使用此掩码过滤df1
中的行:
m = df1['a'].isin(df2['a']) & ~df1['a'].duplicated()
df = df1[~m]
结果:
print(df)
a b c
0 1 1 6
1 1 2 5
3 3 4 3
5 4 6 1
答案 1 :(得分:0)
尝试一下:
import pandas as pd
df1=pd.DataFrame({'a':[1,1,2,3,4,4],'b':[1,2,3,4,5,6],'c':[6,5,4,3,2,1]})
df2=pd.DataFrame({'a':[2,4,2],'b':[1,2,3],'c':[6,5,4]})
df2a = df2['a'].tolist()
def remove_df2_dup(x):
if x in df2a:
df2a.remove(x)
return False
return True
df1[df1.a.apply(remove_df2_dup)]
它从df2['a']
创建一个列表,然后针对df1['a']
的每个值检查该列表,每次df1
中存在匹配项时从列表中删除值
答案 2 :(得分:0)
尝试
df1=pd.DataFrame({'a':[1,1,2,3,4,4],'b':[1,2,3,4,5,6],'c':[6,5,4,3,2,1]})
df2=pd.DataFrame({'a':[2,4,2],'b':[1,2,3],'c':[6,5,4]})
for x in df2.a:
if x in df1.a:
df1.drop(df1[df1.a==x].index[0], inplace=True)
print(df1)