在对两个熊猫列进行求和时,当两列之一是浮点数时,我想忽略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)
答案 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