如何在DataFrame中对比两列并生成相等标识列(1/0)
DataFrame新增对比列并计算正误占比的解决方案
问题说明
你需要在DataFrame中新增一列same,标记ConvenienceStoreClosest和ConvenienceStoreClosestOSRM两列的每行值是否相同(1表示相同/正确,0表示不同/错误),再计算两者的占比。但你之前的代码逻辑存在错误:直接比较列名字符串而非对应行的实际值,且apply仅传入了单一列的数据,根本没用到另一列的内容。
错误代码分析
你的原有代码:
def same(closests): if 'ConvenienceStoreClosest' >= 'ConvenienceStoreClosestOSRM': return 1 else: return 0 df_all['same'] = df_all['ConvenienceStoreClosest'].apply(same)
核心问题:
- 函数内比较的是两个列名的字符串,不是每行的实际数值
apply仅传入了ConvenienceStoreClosest列的值,完全未涉及ConvenienceStoreClosestOSRM列的数据
正确实现方式
方法一:直接列运算(推荐,效率更高)
无需自定义函数,直接对两列做相等判断,再转换为整数类型:
# 新增same列,1表示两列值相同,0表示不同 df_all['same'] = (df_all['ConvenienceStoreClosest'] == df_all['ConvenienceStoreClosestOSRM']).astype(int)
方法二:使用apply按行处理
如果一定要用自定义函数,需指定axis=1让apply按行处理,函数接收整行数据后比较对应列:
def same(row): return 1 if row['ConvenienceStoreClosest'] == row['ConvenienceStoreClosestOSRM'] else 0 df_all['same'] = df_all.apply(same, axis=1)
计算正误占比
方式一:用均值计算
correct_ratio = df_all['same'].mean() # 正确占比(1的比例) error_ratio = 1 - correct_ratio # 错误占比(0的比例) print(f"正确占比: {correct_ratio:.2%}") print(f"错误占比: {error_ratio:.2%}")
方式二:用value_counts统计
ratio = df_all['same'].value_counts(normalize=True) print(f"正确占比: {ratio.get(1, 0):.2%}") print(f"错误占比: {ratio.get(0, 0):.2%}")
内容的提问来源于stack exchange,提问作者lmes
相关产品推荐
相关产品推荐

