首页 > 解决方案 > 在 Pandas 和 Numpy Python 中保留 Nan 的同时进行值比较的更优雅的方法

问题描述

所以基本上我想要5 > np.nanreturnnp.nan或 Nan 而不是FALSE
在熊猫系列中,这是代码:

import pandas as pd
import numpy as np
a = pd.DataFrame({"x":[1,2,3,4],"y":[1,np.nan,5,1]})

a["x"]>a["y"]

将返回 :

0    False
1    False
2    False
3    True
dtype: bool

我目前保存 Nan 信息的方法是:

value_comparison = a["x"]>a["y"]
nan_comparison = a["x"].isna() | a["y"].isna()
value_comparison.where(~nan_comparison,np.nan)

它返回的地方

0    0.0
1    NaN
2    0.0
3    1.0
dtype: float64

我也采用了类似的方法进行 numpy 比较

即使结果是正确的,我相信我的解决方案并不优雅,有没有更好的(pandas 和 numpy)方法来做到这一点,它遵循python 的禅宗?(更好的可读性,更直接)

标签: pythonpandas

解决方案


只有一点改进/(更改)您的解决方案:

value_comparison = (a["x"]>a["y"])
nan_comparison = a[["x", "y"]].notna().all(axis=1)
#alternative
#nan_comparison = a["x"].notna() & a["y"].notna()
m = value_comparison.where(nan_comparison)
print (m)
0    0.0
1    NaN
2    0.0
3    1.0
dtype: float64

最后可以转换为nullable boolean

m = value_comparison.where(nan_comparison).astype('boolean')
print (m)
0    False
1     <NA>
2    False
3     True
dtype: boolean

推荐阅读