使用 pandas 在两个数据框中查找相似的行

Finding similar rows in two dataframes using pandas

我有两个数据框, 第一个是根数据帧,第二个是从第一个数据帧获得的(它基于“名称”必须重复 3 次的模式,“子集”必须是下面数据帧 2 中所示的模式)。

基于这两个数据框,我需要向根数据框添加一个“备注”列,该列写“是”是数据框 1 中的特定行存在于数据框 2 中,否则它应该是空白的。

DataFrame1-

Name    Subset            Value
A       67-A-5678          14
A       58-ABC-87555       187
A       45-ASH-87954       5465
T       78-A-8793          4533
T       52-O-5642          5644
S       34-A-8785          454
S       58-ASO-98978       54
S       23-ASH-87895       784
X       98-X-87876         455
X       87-ABC-54578       4545
X       56-ASH-89667       854
Y       09-D-98644         45
Y       87-ABC-78834       98
Y       87-ASH-87455A      4566
L       67-A-87545         78
L       89-GHS-08753       12 
L       78-PHU-09876       655 

DataFrame2-

Name    Subset             Value
A       67-A-5678          14       
A       58-ABC-87555       187      
A       45-ASH-87954       5465     
X       98-X-87876         455
X       87-ABC-54578       4545
X       56-ASH-89667       854
Y       09-D-98644         45
Y       87-ABC-78834       98
Y       87-ASH-87455A      4566

输出数据帧-

Name    Subset            Value    Remark
A       67-A-5678          14      Yes
A       58-ABC-87555       187     Yes 
A       45-ASH-87954       5465    Yes
T       78-A-8793          4533
T       52-O-5642          5644
S       34-A-8785          454
S       58-ASO-98978       54
S       23-ASH-87895       784
X       98-X-87876         455     Yes
X       87-ABC-54578       4545    Yes
X       56-ASH-89667       854     Yes
Y       09-D-98644         45      Yes
Y       87-ABC-78834       98      Yes
Y       87-ASH-87455A      4566    Yes
L       67-A-87545         78
L       89-GHS-08753       12 
L       78-PHU-09876       655

P.S。实际数据集可以有很多 columns/rows.

您可以 mergeindicator=True 并使用“两者” 属性 来获取匹配的行:

(df1.merge(df2, on=list(df1.columns), how='left', indicator=True)
    .assign(**{'Remark Added': lambda d: d['_merge'].eq('both').map({True: 'Yes', False: ''})})
    .drop(columns='_merge')
)

注意。要查看其工作原理,请注释 .drop(columns='_merge') 行以保留临时 _merge

输出:

   Name         Subset  Value Remark Added
0     A      67-A-5678     14          Yes
1     A   58-ABC-87555    187          Yes
2     A   45-ASH-87954   5465          Yes
3     T      78-A-8793   4533             
4     T      52-O-5642   5644             
5     S      34-A-8785    454             
6     S   58-ASO-98978     54             
7     S   23-ASH-87895    784             
8     X     98-X-87876    455          Yes
9     X   87-ABC-54578   4545          Yes
10    X   56-ASH-89667    854          Yes
11    Y     09-D-98644     45          Yes
12    Y   87-ABC-78834     98          Yes
13    Y  87-ASH-87455A   4566          Yes
14    L     67-A-87545     78             
15    L   89-GHS-08753     12             
16    L   78-PHU-09876    655