对DataFrame执行条件筛选返回NaN?坐标数据离群值处理疑问
问题原因及解决方案
为什么返回NaN?
你得到NaN的核心原因是筛选条件的维度不匹配:
- 你计算的
lat_mean和lat_std是对应两列(pickup_latitude、dropoff_latitude)各自的均值和标准差,因此np.abs(df[两列] - lat_mean) < 2*lat_std返回的是一个二维布尔DataFrame(和原df的这两列行数、列数一致,每个单元格表示对应位置是否满足条件)。 - 当用二维布尔数组直接索引原df时,pandas不会删除行,而是保留所有行,但将不满足对应列条件的单元格值替换为NaN,这就是你看到结果里全是NaN的原因。
正确的筛选方式
你的需求是保留符合条件的样本行,需要把二维的列级布尔条件合并为一维的行级布尔条件:
情况1:要求每行的两个纬度值都在各自列的均值±2倍标准差范围内
# 生成列级布尔条件 lat_mask = np.abs(df[['pickup_latitude', 'dropoff_latitude']] - lat_mean) < 2 * lat_std # 合并为行级条件:该行所有列都满足条件 row_mask = lat_mask.all(axis=1) # 筛选行 filtered_df = df[row_mask]
情况2:只要每行任意一个纬度值满足条件就保留
# 合并为行级条件:该行至少一列满足条件 row_mask = lat_mask.any(axis=1) filtered_df = df[row_mask]
补充说明
如果你的真实需求是把超出范围的纬度值替换为NaN(而非删除行),那你当前的代码结果是符合预期的,但显然这和你“保留样本”的需求不符,所以需要用上述行级筛选的方式。
内容的提问来源于stack exchange,提问作者Hemfri
相关产品推荐
相关产品推荐

