You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何比较参考DataFrame与目标DataFrame中的数值?

嘿,我来帮你搞定这两个DataFrame的数值对比问题!先把你给出的两个DataFrame补全(你提供的df里col5没写完,我补了一组示例值方便演示),然后分几种常用的对比方式来讲解:

先明确两个DataFrame的完整定义

import pandas as pd
import numpy as np

# 参考DataFrame ref
ref = pd.DataFrame({
    'col1':['a','b','c','d'], 
    'col2':[100,100,100,300], 
    'col3':[200,200,500,400], 
    'col4':[300,np.NaN,600,600], 
    'col5':[400,np.NaN, 700,700]
})

# 待比较的DataFrame df(补全col5的示例值)
df = pd.DataFrame({
    'col2':[105,100,100,200,300], 
    'col3':[202,200,200,300,391], 
    'col4':[300,np.NaN,350,400,605], 
    'col5':[400,np.NaN, 700, 800, 705]
})

1. 逐元素对比(生成布尔结果)

如果只是想知道每个位置的数值是否相等,直接用比较运算符就行,但要注意NaN的特殊性——默认的==会把NaN判定为不等,所以推荐用pd.DataFrame.eq()并开启na_equal=True来正确识别NaN的匹配:

普通逐元素对比(不处理NaN)

# 只对比共同的数值列(col2-col5),先对齐索引
comparison = df[['col2','col3','col4','col5']] == ref[['col2','col3','col4','col5']].reindex_like(df)
print(comparison)

正确处理NaN的逐元素对比

comparison_with_nan = df[['col2','col3','col4','col5']].eq(
    ref[['col2','col3','col4','col5']].reindex_like(df), 
    na_equal=True
)
print(comparison_with_nan)

2. 计算数值差值(查看具体差异)

如果想知道每个位置的数值差多少,直接做减法即可:

# 先对齐索引和列,再计算差值
diff = df[['col2','col3','col4','col5']] - ref[['col2','col3','col4','col5']].reindex_like(df)
print(diff)

如果想把NaN对应的差值替换成0(或其他值),可以用fillna():

diff_filled = diff.fillna(0)
print(diff_filled)

3. 筛选出与参考值不符的行

如果想找出df中哪些行的数值和ref对应行(按索引)不一致,可以这么做:

# 先判断每行是否所有列都匹配
row_matches = comparison_with_nan.all(axis=1)
# 筛选出不匹配的行
mismatched_rows = df[~row_matches]
print(mismatched_rows)

4. 按col1关联对比(不是按索引)

如果你的df其实也有col1列,或者需要按col1的值和ref匹配(而非按索引),可以先合并两个DataFrame再对比:

# 给df添加col1列示例
df['col1'] = ['a','b','c','e','d']
# 按col1合并,区分参考值和待比较值
merged = pd.merge(ref, df, on='col1', suffixes=('_ref', '_df'))
# 生成匹配结果列
merged['col2_match'] = merged['col2_ref'] == merged['col2_df']
merged['col3_match'] = merged['col3_ref'] == merged['col3_df']
# 计算差值
merged['col2_diff'] = merged['col2_df'] - merged['col2_ref']
print(merged)

几个关键注意点

  • 确保只对比共同的数值列,避免因列名不一致报错;
  • 处理NaN时一定要用eq(na_equal=True),否则默认的==会把两个NaN判定为不等;
  • 如果是按业务字段(比如col1)关联而非索引,必须先合并对齐再对比。

内容的提问来源于stack exchange,提问作者Florian Bernard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:53:49