繁体   English   中英

Pandas 两列之和 - 正确处理 nan 值

[英]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)

文档 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)

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM