根据另一数据框的一列删除一个数据框的行

时间:2020-08-24 15:59:19

标签: python pandas dataframe

我有两个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]})

3 个答案:

答案 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)