在算术运算中将 NaN 视为零?

Ala*_*air 5 python nan pandas

这是我正在努力解决的事情的一个简单示例:

In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: test = pd.DataFrame(np.random.randn(4,4),columns=list('ABCD'))
In [4]: for i in range(4):
  ....:    test.iloc[i,i] = np.nan

In [5]: test
Out[5]:
           A         B         C         D
0        NaN  0.136841 -0.854138 -1.890888
1  -1.261724       NaN  0.875647  1.312823
2   1.130999 -0.208402       NaN  0.256644
3  -0.158458 -0.305250  0.902756       NaN 
Run Code Online (Sandbox Code Playgroud)

现在,如果我使用sum对行求和,所有NaN值都被视为零:

In [6]: test['Sum'] = test.loc[:,'A':'D'].sum(axis=1)

In [7]: test
Out[7]: 
          A         B         C         D       Sum
0       NaN  0.136841 -0.854138 -1.890888 -2.608185
1 -1.261724       NaN  0.875647  1.312823  0.926745
2  1.130999 -0.208402       NaN  0.256644  1.179241
3 -0.158458 -0.305250  0.902756       NaN  0.439048    
Run Code Online (Sandbox Code Playgroud)

但就我而言,我可能需要先对这些值做一些工作;例如缩放它们:

In [8]: test['Sum2'] = test.A + test.B/2 - test.C/3 + test.D

In [9]: test
Out[9]: 
          A         B         C         D       Sum  Sum2
0       NaN  0.136841 -0.854138 -1.890888 -2.608185   NaN
1 -1.261724       NaN  0.875647  1.312823  0.926745   NaN
2  1.130999 -0.208402       NaN  0.256644  1.179241   NaN
3 -0.158458 -0.305250  0.902756       NaN  0.439048   NaN
Run Code Online (Sandbox Code Playgroud)

如您所见,这些NaN值会传递到算术中以产生NaN输出,这正是您所期望的。

现在,我不想NaN用零替换数据框中的所有值:区分零和NaN. 我可以NaN用其他东西代替:我正在处理大量学生成绩,我需要区分零级和NaN目前我用来表示未尝试特定评估任务的零级。(它取代了传统电子表格中的空白单元格。)但无论我用什么替换NaN值,它都需要在我可能执行的操作中被视为零。我在这里有哪些选择?

kmc*_*des 5

使用 fillna 函数

test['Sum2'] = test.A.fillna(0) + test.B.fillna(0)/2 - test.C.fillna(0)/3 + test.D.fillna(0)
Run Code Online (Sandbox Code Playgroud)