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

问题描述 投票:2回答:2

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

sum_df = df.sum(skipna=False)

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

python pandas sum cumsum
2个回答
1
投票

Option is not an option (yet)

似乎没有任何这样的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,
# [...]

拉请求可能是个好主意。

A simple solution

可能不是最好的解决方案,它有点hackish但它确实解决了你的问题。

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

此外,虽然它是一种非常简单的技术并且它是纯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)

然后,sum对象的DataFrame方法每次我们称之为skipna被覆盖到False。现在以下代码:

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

返回:

0   NaN
dtype: float64

代替:

0    3.0
dtype: float64

Automation

我们可以立即将此修改应用于许多功能:

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

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


0
投票

它可能不是最好的方式,但我认为你应该修改大熊猫的文件。

1.找到大熊猫的文件。

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

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

2.找到DataFrame类和方法。

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

3.更改默认值。

当您找到方法时,将skipna=True更改为skipna=False

完成后,保存文件,它应该工作!

我希望我帮助你:)

© www.soinside.com 2019 - 2024. All rights reserved.