熊猫两列之和-正确处理nan值

时间:2020-05-06 13:09:21

标签: python pandas sum nan

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

初始数据框:

Surf1     Surf2
0         0
NaN       8
8         15
NaN       NaN
16        14
15        7

所需的输出:

Surf1     Surf2     Sum
0         0         0
NaN       8         8
8         15        23
NaN       NaN       NaN
16        14        30
15        7         22

尝试过的代码: ->下面的代码忽略了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)

4 个答案:

答案 0 :(得分:4)

documentation 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)

输出

   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

答案 1 :(得分:3)

您可以通过执行以下操作mask

df.sum(1).mask(df.isna().all(1))

0     0.0
1     8.0
2    23.0
3     NaN
4    30.0
5    22.0
dtype: float64

答案 2 :(得分:2)

您可以这样做:

df['Sum'] = df.dropna(how='all').sum(1)

输出:

   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

答案 3 :(得分:2)

您可以使用min_count,如果至少有一个不为null的值,则返回所有行,如果所有null都返回null

df['SUM']=df.sum(min_count=1,axis=1)
#df.sum(min_count=1,axis=1)
Out[199]: 
0     0.0
1     8.0
2    23.0
3     NaN
4    30.0
5    22.0
dtype: float64