Pandas所有NaN的总和是否为零?

xhv8bpkk  于 2023-02-06  发布在  其他
关注(0)|答案(4)|浏览(146)

我试图对Pandas Dataframe 的列求和,当每列都有NaN时,sum = 0;根据文档,我期望sum = NaN。下面是我得到的结果:

In [136]: df = pd.DataFrame()

In [137]: df['a'] = [1,2,np.nan,3]

In [138]: df['b'] = [4,5,np.nan,6]

In [139]: df
Out[139]: 
    a   b
0   1   4
1   2   5
2 NaN NaN
3   3   6

In [140]: df['total'] = df.sum(axis=1)

In [141]: df
Out[141]: 
    a   b  total
0   1   4      5
1   2   5      7
2 NaN NaN      0
3   3   6      9

sum.DataFrame.sum文档说“如果整行/整列都是NA,那么结果也是NA”,所以我不明白为什么索引2的“total”= 0而不是NaN。

qvtsj1bj

qvtsj1bj1#

pandas documentation » API Reference » DataFrame » pandas.DataFrame »
Dataframe .sum(自身,轴=无,跳过=无,级别=无,仅数值=无,最小计数=0,**kwargs)

最小计数:整数,默认值为0

执行操作所需的有效值数。如果存在的非NA值少于min_count,则结果为NA。
版本0.22.0中的新增功能:添加,默认值为0。这意味着全NA或空系列的总和为0,全NA或空系列的乘积为1。
引用Pandas最新的文件,它说min_count将是0的全NA系列。
如果你说min_count=1,那么求和的结果将是NaN

sxpgvts3

sxpgvts32#

伟大的链接由杰夫提供。
在这里你可以找到一个例子:

df1 = pd.DataFrame(); 
df1['a'] = [1,2,np.nan,3];
df1['b'] = [np.nan,2,np.nan,3]

df1
Out[4]: 
     a    b
0  1.0  NaN
1  2.0  2.0
2  NaN  NaN
3  3.0  3.0

df1.sum(axis=1, skipna=False)
Out[6]: 
0    NaN
1    4.0
2    NaN
3    6.0
dtype: float64

df1.sum(axis=1, skipna=True)
Out[7]: 
0    1.0
1    4.0
2    0.0
3    6.0
dtype: float64

df1.sum(axis=1, min_count=1)
Out[7]: 
0    1.0
1    4.0
2    NaN
3    6.0
dtype: float64
d6kp6zgx

d6kp6zgx3#

一种解决方案是选择所有行都是nan的情况,然后将总和设置为nan:

df['total'] = df.sum(axis=1)    
df.loc[df['a'].isnull() & df['b'].isnull(),'total']=np.nan

df['total'] = df.sum(axis=1)    
df.loc[df[['a','b']].isnull().all(1),'total']=np.nan

后一个选项可能更实用,因为您可以创建一个列['a','b', ... , 'z']的列表,您可能希望对这些列求和。

nwsw7zdq

nwsw7zdq4#

我通过将序列转换为numpy数组来解决这个问题,该数组可以正确地计算答案。

print(np.array([np.nan,np.nan,np.nan]).sum()) # nan
print(pd.Series([np.nan,np.nan,np.nan]).sum()) # 0.0
print(pd.Series([np.nan,np.nan,np.nan]).to_numpy().sum()) # nan

相关问题