我试图对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。我缺少什么?
答案 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