根据python中另一个数据框的2列过滤数据框

时间:2020-10-05 07:53:12

标签: python pandas dataframe

我有一个这样的DataFrame:

data = {'Name':['Tom', 'Jack', 'nick', 'juli', 'Tom', 'nick', 'juli','nick', 'juli','Tom'], 'subject': ['eng', 'maths', 'geo', 'maths', 'science', 'geo', 'maths', 'maths', 'geo', 'science'], 'marks':[99, 98, 95, 90, 99, 98, 97, 95, 96, 98]}
df1 = pd.DataFrame(data)

df1

 Name    subject    marks
0   Tom     eng     99
1   Jack    maths   98
2   nick    geo     95
3   juli    maths   90
4   Tom     science 99
5   nick    geo     98
6   juli    maths   97
7   nick    maths   95
8   juli    geo     96
9   Tom     science 98

另一个数据框为:

data2 = {'Name':['Jack', 'nick', 'Tom',  'juli', 'Tom', 'nick','nick', 'juli'], 'subject': ['eng', 'maths', 'geo', 'maths', 'science', 'geo',  'maths', 'geo']}
df2 = pd.DataFrame(data2)


df2

    Name    subject
0   Jack    eng
1   nick    maths
2   Tom     geo
3   juli    maths
4   Tom     science
5   nick    geo
6   nick    maths
7   juli    geo

我想基于df1中“名称”和“主题”的组合来过滤df2。如果df1中“名称”和“主题”的特定组合出现多次,然后在df2中匹配。如果匹配,则从df2获得这些行作为输出。

所需的输出:

pd.DataFrame({'Names':['Tom', 'juli', 'nick'], 'subject': ['science', 'maths', 'geo']})

    Name    subject 
0   nick    geo 
1   juli    maths
2   Tom     science

没有使用“合并”选项的任何人都可以提供帮助吗?

1 个答案:

答案 0 :(得分:1)

我相信您只需要使用DataFrame.duplicated过滤具有重复值的行,而将keep=False链接为不带此参数的merge,并为它们选择第一行,然后使用df11 = df1[df1.duplicated(subset=['Name','subject'], keep=False) & df1.duplicated(subset=['Name','subject'])] df3 = df11.merge(df2, suffixes=('_',''))[df2.columns] print (df3) Name subject 0 nick geo 1 juli maths 2 Tom science 进行内部联接:

df2

另一个类似的想法是通过merge中的cols = df2.columns df11 = df1.loc[df1[cols].duplicated(keep=False) & df1[cols].duplicated(), cols] df3 = df11.merge(df2) print (df3) Name subject 0 nick geo 1 juli maths 2 Tom science 来过滤列:

{{1}}