我有一个这样的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
没有使用“合并”选项的任何人都可以提供帮助吗?
答案 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}}