[英]Pandas sum of two columns - dealing with nan-values correctly
当对两个 pandas 列求和时,当两列之一是浮点数时,我想忽略 nan-values。 但是,当 nan 出现在两列中时,我想将 nan 保留在 output 中(而不是 0.0)。
初始 dataframe:
Surf1 Surf2
0 0
NaN 8
8 15
NaN NaN
16 14
15 7
所需的 output:
Surf1 Surf2 Sum
0 0 0
NaN 8 8
8 15 23
NaN NaN NaN
16 14 30
15 7 22
尝试过的代码: -> 下面的代码忽略了 nan-values,但是当取两个 nan-values 的总和时,它在 output 中给出 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)
默认情况下,空系列或全 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)
output
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
您可以通过执行以下操作来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
你可以做:
df['Sum'] = df.dropna(how='all').sum(1)
Output:
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
您可以使用min_count
,如果所有 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
我认为上面列出的所有解决方案仅适用于缺少 FIRST 列值的情况。 如果您遇到第一列值不丢失但第二列值丢失的情况,请尝试使用:
df['sum'] = df['Surf1']
df.loc[(df['Surf2'].notnull()), 'sum'] = df['Surf1'].fillna(0) + df['Surf2']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.