簡體   English   中英

基於python中另一個數據框的2列過濾數據框

[英]Filter dataframes based on 2 columns of another dataframe in python

我有一個像這樣的數據幀:

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

任何人都可以在不使用“合並”選項的情況下提供幫助嗎?

我相信您只需要通過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

另一個類似的想法是在mergedf2過濾列:

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
    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM