如何基于Pandas按no字段统计两个DataFrame同名列的匹配度?
Pandas统计两个DataFrame同名列匹配情况的最优实现
问题背景
现有两个Pandas DataFrame,列名不完全重合,仅存在部分同名列,数据示例如下:
df1
no datas1 datas2 datas3 datas4 0 a b a a 1 b c b b 2 d b c a
df2
no datas1 datas2 datas3 data4 data5 data6 0 c a a a a b 1 a c b b b b 2 a b c b c c
需求:基于no字段对齐两行数据,统计每个同名列的匹配情况,支持输出匹配数量或匹配百分比,示例结果如下:
datas3 is 3 matched datas4 is 2 matched # 或百分比格式 datas3 is 100% match datas4 is 67% match
最优实现方法
以下是高效且易维护的实现方案,利用Pandas的向量化操作和内置函数完成需求:
完整代码
import pandas as pd # 构造示例数据(实际场景可替换为你的数据读取逻辑) df1 = pd.DataFrame({ 'no': [0, 1, 2], 'datas1': ['a', 'b', 'd'], 'datas2': ['b', 'c', 'b'], 'datas3': ['a', 'b', 'c'], 'datas4': ['a', 'b', 'a'] }) df2 = pd.DataFrame({ 'no': [0, 1, 2], 'datas1': ['c', 'a', 'a'], 'datas2': ['a', 'c', 'b'], 'datas3': ['a', 'b', 'c'], 'data4': ['a', 'b', 'b'], 'data5': ['a', 'b', 'c'], 'data6': ['b', 'b', 'c'] }) # 1. 基于no字段合并两个DataFrame,用后缀区分来源 merged_df = pd.merge(df1, df2, on='no', suffixes=('_df1', '_df2')) # 2. 筛选出除no外的同名列 common_columns = [col for col in df1.columns if col in df2.columns and col != 'no'] # 3. 遍历同名列,统计匹配情况 for col in common_columns: # 计算匹配数量 match_num = (merged_df[f"{col}_df1"] == merged_df[f"{col}_df2"]).sum() # 计算匹配百分比(保留整数) match_percent = round((match_num / len(merged_df)) * 100) # 按需选择输出格式 print(f"{col} is {match_num} matched") # print(f"{col} is {match_percent}% match")
代码说明
- 数据对齐:使用
pd.merge基于no字段合并,确保两行数据严格按no对应,后缀_df1和_df2区分两个DataFrame的列,避免列名冲突。 - 筛选同名列:通过列表推导式快速找出两个DataFrame共有的列(排除作为关联键的
no)。 - 匹配统计:利用Pandas的向量化布尔运算,直接比较对应列的每行数据,求和得到匹配数量;再通过简单计算得到匹配百分比。
方案优势
- 高效性:向量化操作避免了逐行循环,处理大数据量时性能远高于手动遍历。
- 准确性:内置合并函数确保数据对齐准确,不会出现行错位问题。
- 灵活性:可轻松切换输出格式(数量/百分比),或扩展统计逻辑(如统计不匹配数量)。
内容的提问来源于stack exchange,提问作者MYKIM
相关产品推荐
相关产品推荐

