如何在对DataFrame进行数值比较时保留NaN单元格?
问题描述
我有如下DataFrame:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|---|
| 0 | 0.493212 | 0.586246 | nan | 0.589289 | nan | 0.629087 | 0.593872 |
| 1 | 0.568513 | 0.367722 | nan | nan | nan | nan | 0.423369 |
| 2 | 0.70054 | 0.735529 | nan | nan | 0.494135 | nan | nan |
| 3 | nan | nan | nan | 0.338822 | 0.466331 | 0.765367 | 0.83082 |
| 4 | 0.512891 | nan | 0.623782 | 0.642438 | nan | 0.541117 | 0.92981 |
执行比较操作 df >= 0.5 后,得到的结果里NaN单元格被转为False(以0表示):
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|---|
| 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
| 4 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
希望比较时保留NaN单元格,让原DataFrame中的NaN在结果中仍为NaN,而非转为False,该如何操作?
解决方案
方法1:用Pandas内置方法组合实现
直接使用ge()比较方法搭配where()保留原NaN:
df.ge(0.5).where(df.notna())
逻辑:df.ge(0.5)完成>=0.5的比较,生成布尔值DataFrame;df.notna()标记原数据中非NaN的位置,where()会将原NaN的位置保留为NaN,其余位置用比较结果填充。
方法2:借助NumPy实现
用numpy.where精准控制每个位置的返回值:
import numpy as np result = np.where(df.isna(), np.nan, df >= 0.5) pd.DataFrame(result, index=df.index, columns=df.columns)
逻辑:df.isna()定位所有NaN位置,这些位置直接返回NaN;非NaN位置执行df >=0.5的比较,最后将结果转为DataFrame,保持原索引和列名。
两种方法都能实现需求,最终结果中原DataFrame的NaN单元格会被保留,而非转为False。
内容的提问来源于stack exchange,提问作者PaleNeutron
相关产品推荐
相关产品推荐

