numpy 比较 Dataframe ,但保留NaN单元

blpfk2vs  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(171)

例如,我有一个 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|0.423369
2|0.70054|0.735529|NaN|NaN|0.494135|NaN|NaN
3|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

结果是:
|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
我怎么才能保留南牢房呢?我是说我需要0.5 > np.nan == np.nan而不是0.5 > np.nan == False

whlutmcx

whlutmcx1#

IIUC,您可以使用mask

df.lt(0.5).astype(int).mask(df.isna())

输出:

0    1    2    3    4    5    6
0  1.0  0.0  NaN  0.0  NaN  0.0  0.0
1  0.0  1.0  NaN  NaN  NaN  NaN  1.0
2  0.0  0.0  NaN  NaN  1.0  NaN  NaN
3  NaN  NaN  NaN  1.0  1.0  0.0  0.0
4  0.0  NaN  0.0  0.0  NaN  0.0  0.0

如果要保留整数类型:

out = df.lt(0.5).astype(pd.Int64Dtype()).mask(df.isna()))

输出:

0     1     2     3     4     5     6
0     1     0  <NA>     0  <NA>     0     0
1     0     1  <NA>  <NA>  <NA>  <NA>     1
2     0     0  <NA>  <NA>     1  <NA>  <NA>
3  <NA>  <NA>  <NA>     1     1     0     0
4     0  <NA>     0     0  <NA>     0     0
wgeznvg7

wgeznvg72#

DataFrame.mask与值转换为整数一起使用:

df = (df >= 0.5).astype(int).mask(df.isna())
print (df)
     0    1    2    3    4    5    6
0  0.0  1.0  NaN  1.0  NaN  1.0  1.0
1  1.0  0.0  NaN  NaN  NaN  NaN  0.0
2  1.0  1.0  NaN  NaN  0.0  NaN  NaN
3  NaN  NaN  NaN  0.0  0.0  1.0  1.0
4  1.0  NaN  1.0  1.0  NaN  1.0  1.0

详细信息:

print ((df >= 0.5).astype(int))
   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

numpy.select的另一个想法:

df[:] = np.select([df.isna(), df >= 0.5], [None, 1], default=0)
print (df)
     0    1    2    3    4    5    6
0  0.0  1.0  NaN  1.0  NaN  1.0  1.0
1  1.0  0.0  NaN  NaN  NaN  NaN  0.0
2  1.0  1.0  NaN  NaN  0.0  NaN  NaN
3  NaN  NaN  NaN  0.0  0.0  1.0  1.0
4  1.0  NaN  1.0  1.0  NaN  1.0  1.0

顺便说一句,如果需要True/FalseNaN,可以使用Nullable Boolean data type

df = (df >= 0.5).astype(int).mask(df.isna()).astype('boolean')

print (df)
       0      1     2      3      4     5      6
0  False   True  <NA>   True   <NA>  True   True
1   True  False  <NA>   <NA>   <NA>  <NA>  False
2   True   True  <NA>   <NA>  False  <NA>   <NA>
3   <NA>   <NA>  <NA>  False  False  True   True
4   True   <NA>  True   True   <NA>  True   True

相关问题