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

dgd*_*dgd 18 python pandas

我试图对Pandas数据帧的各列进行求和,当我在每列中都有NaN时,我得到的总和= 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
Run Code Online (Sandbox Code Playgroud)

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

Vis*_*dev 17

pandas 文档 » API 参考 » DataFrame » pandas.DataFrame »

DataFrame.sum(self,axis=None,skipna=None,level=None, numeric_only=None, min_count=0, **kwargs)

min_count:整数,默认为 0

执行操作所需的有效值数。如果存在少于 min_count 的非 NA 值,则结果将为 NA。

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

引用熊猫最新的文档,它说min_count全 NA 系列将是 0。

如果你说min_count=1那么总和的结果将是 a NaN


Iza*_*kun 7

杰夫提供的很棒的链接。

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

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
Run Code Online (Sandbox Code Playgroud)


Mar*_*ink 2

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

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

或者

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

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