将 pandas 的skipna 全局默认设置设置为 False

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 的默认行为?

jla*_*rcy 4

选项还不是选项

似乎没有任何选项可以控制这种行为。它是硬编码的:

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,但它可能违反最小惊讶原则(有关详细信息,请参阅此答案)。

MCVE

让我们构建一个覆盖现有默认参数或添加额外参数的包装器:

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 代码本身。