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

Setting pandas global default for skipna to False

对于某些 Pandas 函数,例如 sum()、cumsum() 和 cumprod(),有一个 skipna 选项,默认设置为 True。这给我带来了问题,因为错误可能会悄无声息地传播,所以我总是明确地将 skipna 设置为 False。

sum_df = df.sum(skipna=False)

每次出现这些函数之一时都这样做会使代码看起来有点笨拙。有没有办法可以更改 Pandas 中的默认行为?

这可能不是最好的方法,但我认为你应该 修改 pandas' 文件.

1.找到 pandas' 文件。

如果您使用 pip 安装 pandas,它应该位于 python 安装文件夹中的 Lib 文件中。如果您不知道 python 的安装位置,请在 Google.

上查找

如果您没有使用 pip 安装它,请查看 Google 与您的软件(anaconda 或其他)一起安装的软件包所在的位置

2。找到 DataFrame class 和方法。

最好的方法是按 CTRL+F 或其他字母来查找方法

3。更改默认值。

找到方法后,将 skipna=True 更改为 skipna=False

完成此操作后,保存文件,它应该可以工作了!

希望对你有所帮助:)

选项不是一个选项(还)

似乎没有什么 option 可以控制这种行为。它是硬编码的:

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,
# [...]

拉取请求可能是个好主意。

一个简单的解决方案

可能不是最好的解决方案,它有点老套,但确实可以解决您的问题。

我并不是说这是一般的好做法。它可能有我没有解决的缺点(欢迎您在评论中列出)。无论如何,此解决方案的优点是 非侵入性

此外,虽然这是一个非常简单的技术,而且是纯PSL,但它可能会违反最小惊讶原则(详见answer)。

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

然后,我们可以装饰任何函数。例如:

import pandas as pd
pd.DataFrame.sum = set_default(pd.DataFrame.sum, skipna=False)

然后,DataFrame 对象的 sum 方法在我们每次调用它时都会将其 skipna 覆盖为 False。现在代码如下:

import numpy as np
df = pd.DataFrame([1., 2., np.nan])
df.sum()

Returns:

0   NaN
dtype: float64

而不是:

0    3.0
dtype: float64

自动化

我们可以一次将此修改应用于多个函数:

for key in ['sum', 'mean', 'std']:
    setattr(pd.DataFrame, key, set_default(getattr(pd.DataFrame, key), skipna=False))

如果我们将这些修改存储到 python 模块(.py 文件)中,它们将在导入时应用,而无需修改 Pandas 代码本身。