我试图对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。
杰夫提供的很棒的链接。
在这里你可以找到一个例子:
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)
解决方案是选择所有行均为 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']后一个选项可能更实用,因为您可以创建一个您可能想要求和的列的列表。
| 归档时间: |
|
| 查看次数: |
3769 次 |
| 最近记录: |