大熊猫中所有NaN的总和归零?

时间:2015-10-31 04:17:12

标签: python pandas

我试图对Pandas数据帧的各列进行求和,当我在每列中都有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

pandas.DataFrame.sum文档说"如果整行/列是NA,结果将是NA",所以我不明白为什么"总计" = 0而不是指数2的NaN。我缺少什么?

4 个答案:

答案 0 :(得分:1)

解决方案是选择行全纳的所有情况,然后将总和设置为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']的列表,您可能想要求和。

答案 1 :(得分:1)

杰夫提供了很棒的链接。

在这里你可以找到一个例子:

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

答案 2 :(得分:0)

我通过将系列转换为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

答案 3 :(得分:0)

pandas 0.24.2 documentation » API Reference » DataFrame » pandas.DataFrame »

  

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

     

所需的有效值数量   执行操作。如果少于min_count个非NA值是   现在结果将是NA。

     

0.22.0版中的新功能:添加了默认值0。这意味着   全NA或空系列的总和为0,而全NA或乘积为   空系列为1。

引用熊猫的最新文档说,min_count对于全NA系列将为0

如果您说min_count=1,则总和为nan