在Python中对比两个DataFrame列,获取匹配行计数与行号
Python实现DataFrame列匹配统计
需求说明
现有两个DataFrame(df1、df2),需要对比df1的Name列与df2的Applicant列,生成包含匹配状态(是/否)、匹配行的行号以及匹配次数的结果表。
示例数据
import pandas as pd # 构造df1 df1 = pd.DataFrame({ 'Name': ['Pat', 'Chris', 'Pat', 'Noris', 'Mit', 'Chen'], 'Score': [82, 38, 92, 88, 62, 58], 'Year': [1990, 1993, 1994, 1997, 1999, 1996] }) # 构造df2 df2 = pd.DataFrame({ 'Applicant': ['Pat', 'Chris', 'Meet'] })
实现代码
# 给df1添加从1开始的行号列 df1['row_num'] = df1.index + 1 # 按Name分组,收集匹配行号(转为逗号分隔的字符串)、统计匹配次数 match_info = df1.groupby('Name').agg( Matched_Row_reference=('row_num', lambda x: ','.join(map(str, x))), Count=('row_num', 'count') ).reset_index().rename(columns={'Name': 'Applicant'}) # 与df2左连接,保留所有Applicant项 result = df2.merge(match_info, on='Applicant', how='left') # 生成匹配状态、填充缺失值 result['Match (Y/N)'] = result['Count'].apply(lambda x: 'Y' if pd.notna(x) else 'N') result['Matched Row reference'] = result['Matched_Row_reference'].fillna('NA') result['Count'] = result['Count'].fillna(0).astype(int) # 调整列顺序为预期格式 result = result[['Applicant', 'Match (Y/N)', 'Matched Row reference', 'Count']] print(result)
运行结果
| Applicant | Match (Y/N) | Matched Row reference | Count |
|---|---|---|---|
| Pat | Y | 1,3 | 2 |
| Chris | Y | 2 | 1 |
| Meet | N | NA | 0 |
代码说明
- 行号处理:给df1添加从1开始的行号列,匹配预期结果的行号格式。
- 分组聚合:通过
groupby对Name分组,拼接行号字符串并统计匹配次数。 - 合并填充:用左连接保留df2所有项,对未匹配项填充
NA和0,生成匹配状态标识。 - 列序调整:确保输出列与预期结果一致。
内容的提问来源于stack exchange,提问作者Tushar Patel
相关产品推荐
相关产品推荐

