如何检查Pandas DataFrame中所有浮点列是否近似相等
验证DataFrame中多列浮点值是否两两近似相等
问题描述
有一个包含12列的DataFrame,其中多列为浮点型,需要验证指定列的每行值是否两两近似相等(阈值设为0.062)。只要任意一对列的值不满足近似相等,该行的验证结果即为False(例如示例中id为xyz的行)。
示例数据
import pandas as pd df = pd.DataFrame({ 'id' : ['abc', 'pqr', 'xyz', 'cbz'], 'col1' : [0.0234, 0.001852, 4.123, 0.0012], 'col2' : [0.0235, 0.001851, 0.0123, 0.0013], 'col3' : [0.0233, 0.001849, 0.124, 0.0011] })
解决方案
方法一:基于基准列快速验证
利用np.isclose的广播特性,将每行所有列与第一列进行比较,若所有列都与基准列近似相等,则可认为两两近似相等(适用于绝对阈值场景,效率更高):
import numpy as np # 指定需要验证的目标列(实际场景替换为12列的列名) target_cols = ['col1', 'col2', 'col3'] # 设置近似阈值 tolerance = 0.062 # 新增列存储验证结果 df['all_close'] = df[target_cols].apply( lambda row: np.all(np.isclose(row, row.iloc[0], atol=tolerance)), axis=1 ) # 查看结果 print(df)
输出结果:
id col1 col2 col3 all_close 0 abc 0.023400 0.023500 0.023300 True 1 pqr 0.001852 0.001851 0.001849 True 2 xyz 4.123000 0.012300 0.124000 False 3 cbz 0.001200 0.001300 0.001100 True
方法二:严格验证所有两两列对
如果需要确保每一对列都满足近似相等(避免极端情况下的传递性误差),可以遍历所有列的两两组合进行检查:
from itertools import combinations def check_pairs(row, tol): # 生成所有列的两两组合 for col_a, col_b in combinations(row.index, 2): if not np.isclose(row[col_a], row[col_b], atol=tol): return False return True df['all_close'] = df[target_cols].apply(check_pairs, tol=tolerance, axis=1)
说明
atol参数用于设置绝对误差阈值,若需要相对误差可搭配rtol参数使用(np.isclose默认rtol=1e-05,atol=1e-08)- 当列数较多(如12列),方法一的效率远高于方法二(仅需比较n-1次,方法二需比较C(n,2)次)
内容的提问来源于stack exchange,提问作者Karthik S
相关产品推荐
相关产品推荐

