You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas中按条件过滤后得到空DataFrame的原因及解决方法

问题原因与修正方案

问题根源

  1. 逻辑偏离目标:你的核心需求是「将超标温度列值替换为NaN」,但原代码用df1[condition]标记超标值为NaN后,又调用dropna()默认删除任何包含NaN的行(how='any')——只要某一行有一个温度列超标,整行就会被删除,最终导致空DataFrame。
  2. 索引操作的隐性影响:用布尔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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:16:17