如何用Pandas批量比较DataFrame中仅后缀不同列的相等占比?
批量比较同前缀列对,计算值相等占比(Pandas实现)
完全可以用Pandas自动处理,不用手动列每一对,核心是通过列名分组来批量操作,具体步骤如下:
1. 按前缀给列分组
假设你的列都是前缀_df1和前缀_df2的格式,先提取每个列的前缀,把同前缀的列归到一组:
import pandas as pd # 替换成你自己的DataFrame df = pd.DataFrame({ 'id': ['A1', 'A2', 'A3', 'A4', 'A5'], 'col1_df1': [1,2,3,4,5], 'col2_df1': [10,20,30,40,50], 'col3_df1': [100,200,300,400,500], 'col1_df2': [1,2,3,4,6], 'col2_df2': [10,20,30,40,50], 'col3_df2': [100,201,300,400,500] }) # 按最后一个下划线拆分提取前缀,完成列分组 col_groups = {} for col in df.columns.drop('id'): # 跳过id列 prefix = col.rsplit('_', 1)[0] # 从"col1_df1"中提取"col1" col_groups.setdefault(prefix, []).append(col)
2. 遍历分组,计算每对列的相等占比
对每个前缀组里的两列,统计值相等的行数占总行数的比例:
match_rates = {} for prefix, cols in col_groups.items(): if len(cols) == 2: # 确保每组刚好是df1和df2两列 col_a, col_b = cols # 直接用mean()统计相等占比,True会被视为1,False视为0 match_rate = (df[col_a] == df[col_b]).mean() match_rates[prefix] = match_rate # 转成DataFrame让结果更直观 result = pd.DataFrame(match_rates.values(), index=match_rates.keys(), columns=['值相等占比']) print(result)
运行后输出示例:
值相等占比 col1 0.8 col2 1.0 col3 0.8
适配不同列名格式
如果你的列后缀不是_df1/_df2,比如是_old/_new,只需要调整前缀拆分逻辑:
- 若前缀是第一个下划线前的内容,用
col.split('_', 1)[0] - 其他规则的列名,只要保证前缀能唯一标识一组,对应修改字符串处理逻辑即可。
注意事项
- 确保每组两列的数据类型一致,否则比较会出现异常(比如数值和字符串对比会直接返回False),可以用
df.dtypes提前检查。 - 存在缺失值时,
==会将缺失值视为不相等;如果需要把缺失值视为相等,可改用df[col_a].eq(df[col_b], na=True)(Pandas 1.1.0及以上版本支持)。
内容的提问来源于stack exchange,提问作者AldanaBRZ
相关产品推荐
相关产品推荐

