解析奥运金牌统计Python代码中使用numpy.isfinite的原因
代码中
numpy.isfinite函数的使用原因解析 前置逻辑:代码前序处理产生的异常值场景
先理清楚代码前几步的实际运行效果:
- 代码中两次调用的
copy_df.where(),并不会直接删除不满足条件的行:它的逻辑是保留满足判断条件的原有值,不满足条件的整行所有字段都会被赋值为NaN空值。 - 后续依次计算夏冬金牌差
Diff、金牌数占比Gold_Ratio的过程中,这些被置空的行会参与运算,最终产出两种无法参与有效计算的非有限值:- 空值
NaN:只要行被置空,分子分母都为NaN时,除法结果自然也是NaN - 带符号的无穷值
inf/-inf:若某行未被完全置空,但金牌总数Gold + Gold.1计算结果为0,做除法时就会触发除零,产生无穷值
- 空值
np.isfinite的核心作用
np.isfinite是一个元素级判断函数,会对输入的每个值做校验,仅当值为有限的普通实数时返回True,其余情况全部返回False。
它在这里的核心用途,就是对Gold_Ratio列做行过滤:
- 直接筛除所有被
where操作置空的无效行(也就是不满足「夏奥冬奥都至少拿1金」的国家行) - 自动排除所有除零产生的无穷值,避免后续计算最大值时,把无意义的无穷值当成结果
- 相比单纯用
dropna()过滤空值,np.isfinite可以同时识别并排除NaN、正无穷、负无穷三类异常值,过滤覆盖的场景更全 - 最终留下的数据集,刚好完全匹配业务需求:所有纳入计算的国家,都是夏奥、冬奥金牌数都大于0、占比值为有效有限实数的样本
如果去掉这一步过滤,后续调用max()求最大占比时,要么返回NaN,要么返回没有实际意义的无穷值,根本得不到正确的国家结果。
内容的提问来源于stack exchange,提问作者iAvesh
相关产品推荐
相关产品推荐

