np.cumsum(df['column']) nan的处理

Tes*_*est 6 python numpy pandas

np.cumsum([1, 2, 3, np.nan, 4, 5, 6])将返回nan第一个之后的每个值np.nan。此外,它会对任何生成器执行相同的操作。然而,np.cumsum(df['column'])不会。做什么np.cumsum(...),以便对数据帧进行特殊处理?

In [2]: df = pd.DataFrame({'column': [1, 2, 3, np.nan, 4, 5, 6]})

In [3]: np.cumsum(df['column'])
Out[3]: 
0     1.0
1     3.0
2     6.0
3     NaN
4    10.0
5    15.0
6    21.0
Name: column, dtype: float64
Run Code Online (Sandbox Code Playgroud)

Mar*_*yer 6

当您np.cumsum(object)使用不是 numpy 数组的对象进行调用时,它将尝试调用有关详细信息object.cumsum(),请参阅此线程。您还可以在Numpy 源中看到它。

pandas方法的默认值为skipna=True. 所以np.cumsum(df)变成 的等价物df.cumsum(axis=None, skipna=True, *args, **kwargs),当然会跳过 NaN 值。Numpy 方法没有选项skipna。

您还可以通过用您自己的方法覆盖 pandas 方法来亲自验证这一点:

class DF(pd.DataFrame):
    def cumsum(self, axis=None, skipna=True, *args, **kwargs):
        print('calling pandas cumsum')
        return super().cumsum(axis=None, skipna=True, *args, **kwargs)

df = DF({'column': [1, 2, 3, np.nan, 4, 5, 6]})

# does calling the numpy function call your pandas method?   
np.cumsum(df)
Run Code Online (Sandbox Code Playgroud)

这将打印

calling pandas cumsum
Run Code Online (Sandbox Code Playgroud)

并返回预期结果:

    column
0   1.0
1   3.0
2   6.0
3   NaN
4   10.0
5   15.0
6   21.0
Run Code Online (Sandbox Code Playgroud)

然后您可以试验更改的结果skipna=True。