使用 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.
您可以 merge
和 indicator=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
我有两个数据框, 第一个是根数据帧,第二个是从第一个数据帧获得的(它基于“名称”必须重复 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.
您可以 merge
和 indicator=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