Spi*_*or8 5 python sum pandas cumsum
对于某些 Pandas 函数,例如 sum()、cumsum() 和 cumprod(),有一个 Skipna 选项,默认设置为 True。这给我带来了问题,因为错误可能会悄悄地传播,所以我总是明确地将skipna设置为False。
sum_df = df.sum(skipna=False)
Run Code Online (Sandbox Code Playgroud)
每次出现这些函数之一时都执行此操作会使代码看起来有点笨拙。有没有办法改变 Pandas 的默认行为?
似乎没有任何选项可以控制这种行为。它是硬编码的:
import inspect
inspect.getfile(pd.DataFrame.sum) # './pandas/core/generic.py'
inspect.getsource(pd.DataFrame.sum)
# @Substitution(outname=name, desc=desc, name1=name1, name2=name2,
# axis_descr=axis_descr, min_count=_min_count_stub,
# see_also=see_also, examples=examples)
# @Appender(_num_doc)
# def stat_func(self, axis=None, skipna=None, level=None, numeric_only=None,
# [...]
Run Code Online (Sandbox Code Playgroud)
对于拉取请求来说,这可能是一个好主意。
可能不是最好的解决方案,它有点黑客,但它确实解决了您的问题。
我并不是说这总体上是一个好的做法。它可能有我没有解决的缺点(欢迎您在评论中列出)。无论如何,这个解决方案的优点是非侵入性。
此外,虽然这是一种非常简单的技术并且是纯粹的 PSL,但它可能违反最小惊讶原则(有关详细信息,请参阅此答案)。
让我们构建一个覆盖现有默认参数或添加额外参数的包装器:
def set_default(func, **default):
def inner(*args, **kwargs):
kwargs.update(default) # Update function kwargs w/ decorator defaults
return func(*args, **kwargs) # Call function w/ updated kwargs
return inner # Return decorated function
Run Code Online (Sandbox Code Playgroud)
然后,我们可以装饰任何函数。例如:
import pandas as pd
pd.DataFrame.sum = set_default(pd.DataFrame.sum, skipna=False)
Run Code Online (Sandbox Code Playgroud)
然后,每次调用对象sum的方法时DataFrame都会skipna覆盖它。False现在有以下代码:
import numpy as np
df = pd.DataFrame([1., 2., np.nan])
df.sum()
Run Code Online (Sandbox Code Playgroud)
返回:
0 NaN
dtype: float64
Run Code Online (Sandbox Code Playgroud)
代替:
0 3.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)
我们可以立即将此修改应用于许多函数:
for key in ['sum', 'mean', 'std']:
setattr(pd.DataFrame, key, set_default(getattr(pd.DataFrame, key), skipna=False))
Run Code Online (Sandbox Code Playgroud)
如果我们将这些修改存储到 python 模块(.py文件)中,它们将在导入时应用,而无需修改 Pandas 代码本身。