如何统计含NaN的DataFrame浮点数列中数值不等的行数?
含NaN浮点数列的比较与差异统计方案
针对你遇到的两个问题(浮点数近似比较、NaN视为相等并排除统计),可以通过结合pandas的NaN判断与numpy的近似相等函数来解决,具体步骤如下:
核心思路
我们需要统计的是非双NaN且浮点值不近似相等的行数:
- 先筛选出两列均为NaN的行,这类行直接排除统计;
- 对非双NaN的行,用近似比较判断浮点值是否相等;
- 最后统计满足「非双NaN且不近似相等」的行数。
代码实现
假设两个DataFrame分别为df1和df2,目标列为target_col:
import pandas as pd import numpy as np # 示例数据(可替换为你的真实数据) df1 = pd.DataFrame({'target_col': [1.234567, np.nan, 3.14159, 2.71828, np.nan]}) df2 = pd.DataFrame({'target_col': [1.234568, np.nan, 3.14159, 2.71829, 5.0]}) # 1. 标记两列均为NaN的行 both_nan = df1['target_col'].isna() & df2['target_col'].isna() # 2. 判断浮点值是否近似相等(equal_nan=False避免误判单NaN情况) approx_equal = np.isclose(df1['target_col'], df2['target_col'], equal_nan=False) # 3. 筛选出需要统计的差异行:非双NaN + 不近似相等 diff_rows = ~both_nan & ~approx_equal # 统计差异行数 diff_count = diff_rows.sum() print(f"数值不同的行数:{diff_count}")
关键细节说明
np.isclose():通过**相对容差(rtol)和绝对容差(atol)**判断浮点数近似相等,默认参数rtol=1e-05, atol=1e-08可根据你的精度需求调整;both_nan的判断:确保两个NaN被视为相等并排除在统计外;diff_rows的逻辑:只统计那些至少有一个值非NaN,且浮点值确实不近似相等的行。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

