Pandas 两列的总和 - 正确处理 nan 值

Mat*_*000 3 python sum nan pandas

对两个 Pandas 列求和时,当两列之一是浮点数时,我想忽略 nan 值。但是,当 nan 出现在两列中时,我想将 nan 保留在输出中(而不是 0.0)。

初始数据帧:

Surf1     Surf2
0         0
NaN       8
8         15
NaN       NaN
16        14
15        7
Run Code Online (Sandbox Code Playgroud)

期望的输出:

Surf1     Surf2     Sum
0         0         0
NaN       8         8
8         15        23
NaN       NaN       NaN
16        14        30
15        7         22
Run Code Online (Sandbox Code Playgroud)

尝试过的代码: -> 下面的代码忽略了 nan 值,但是当取两个 nan 值的总和时,它在输出中给出 0.0,在这种情况下,我想将其保留为 NaN,以将这些空值与以下值分开求和后实际上为0。

import pandas as pd
import numpy as np

data = pd.DataFrame({"Surf1": [10,np.nan,8,np.nan,16,15], "Surf2": [22,8,15,np.nan,14,7]})
print(data)

data.loc[:,'Sum'] = data.loc[:,['Surf1','Surf2']].sum(axis=1)
print(data)
Run Code Online (Sandbox Code Playgroud)

Sub*_*mal 6

来自文档 pandas.DataFrame.sum

默认情况下,空或全 NA 系列的总和为 0。

>>> pd.Series([]).sum() # min_count=0 是默认的 0.0

这可以通过 min_count 参数进行控制。例如,如果您希望空系列的总和为 NaN,请传递 min_count=1。

将您的代码更改为

data.loc[:,'Sum'] = data.loc[:,['Surf1','Surf2']].sum(axis=1, min_count=1)
Run Code Online (Sandbox Code Playgroud)

输出

   Surf1  Surf2
0   10.0   22.0
1    NaN    8.0
2    8.0   15.0
3    NaN    NaN
4   16.0   14.0
5   15.0    7.0
   Surf1  Surf2   Sum
0   10.0   22.0  32.0
1    NaN    8.0   8.0
2    8.0   15.0  23.0
3    NaN    NaN   NaN
4   16.0   14.0  30.0
5   15.0    7.0  22.0
Run Code Online (Sandbox Code Playgroud)