Pandas中按条件过滤后得到空DataFrame的原因及解决方法
问题原因与修正方案
问题根源
- 逻辑偏离目标:你的核心需求是「将超标温度列值替换为NaN」,但原代码用
df1[condition]标记超标值为NaN后,又调用dropna()默认删除任何包含NaN的行(how='any')——只要某一行有一个温度列超标,整行就会被删除,最终导致空DataFrame。 - 索引操作的隐性影响:用布尔DataFrame索引原DataFrame时,非温度列(如
AmbientTemp)会完整保留,但温度列的NaN会触发dropna()的删除逻辑,哪怕其他列数据都有效。
修正方案
根据实际需求分两种场景处理:
场景1:替换超标值为NaN,保留所有行(匹配原始目标)
直接对温度列做条件替换,无需过滤行:
temp_cols = ['Temp1', 'Temp2', 'Temp3', 'Temp4', 'Temp5', 'Temp6'] ambient_col = 'AmbientTemp' # 对每个温度列,将超过阈值的值替换为NaN df1[temp_cols] = df1[temp_cols].where(df1[temp_cols].lt(df1[ambient_col] + 40, axis=0)) print(df1)
处理后,超标温度值会被替换为NaN,所有行完整保留,包括存在部分超标列的行。
场景2:只保留所有温度列都不超标的行
若实际需求是过滤出全列达标的行,需先将每行的多列条件合并为整体判断:
temp_cols = ['Temp1', 'Temp2', 'Temp3', 'Temp4', 'Temp5', 'Temp6'] ambient_col = 'AmbientTemp' # 生成每行所有温度列都符合条件的布尔数组 row_condition = df1[temp_cols].lt(df1[ambient_col] + 40, axis=0).all(axis=1) # 过滤出符合条件的行 filtered_df = df1[row_condition] print(filtered_df.shape) # 示例数据中第1、4、5行全列达标,输出应为(3,7)
这里用all(axis=1)确保每行所有温度列都满足条件,再用一维布尔数组过滤行,不会引入NaN,无需dropna()。
为什么原代码返回空DataFrame?
看示例数据:
- 第2行
Temp6=69,超过28.8+40=68.8,被设为NaN后触发dropna()删除; - 第3行
Temp2=87、Temp4=80均超标,同样被删除;
如果你的实际数据中所有行都至少有一个温度列超标,df1[condition]后每行都存在NaN,dropna()就会删除所有行,得到空结果。
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

