对于某些Pandas函数,例如sum(),cumsum()和cumprod(),skipna有一个选项,默认情况下设置为True。这会给我带来问题,因为错误可能会无声地传播,因此我总是将skipna明确设置为False。
sum_df = df.sum(skipna=False)
每次出现这些函数之一时都会这样做会使代码看起来有点笨拙。有没有办法可以改变Pandas中的默认行为?
似乎没有任何这样的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,
# [...]
拉请求可能是个好主意。
可能不是最好的解决方案,它有点hackish但它确实解决了你的问题。
我并不是说这是一般的好习惯。它可能有一些我没有解决的缺点(欢迎您在评论中列出)。无论如何,这种解决方案具有非侵入性的优点。
此外,虽然它是一种非常简单的技术并且它是纯PSL,但它可能违反最小惊讶原则(详情请参阅此answer)。
让我们构建一个覆盖现有默认参数或添加额外参数的包装器:
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
我们可以立即将此修改应用于许多功能:
for key in ['sum', 'mean', 'std']:
setattr(pd.DataFrame, key, set_default(getattr(pd.DataFrame, key), skipna=False))
如果我们将这些修改存储到python模块(.py
文件)中,它们将在导入时应用,而无需修改Pandas代码本身。
它可能不是最好的方式,但我认为你应该修改大熊猫的文件。
1.找到大熊猫的文件。
如果您使用pip安装了pandas,它应该位于Lib文件中,该文件位于python安装文件夹中。如果您不知道python的安装位置,请在Google上查找。
如果您没有使用pip安装它,请在Google上查找与您的软件一起安装的软件包(anaconda或其他)
2.找到DataFrame类和方法。
最好的方法是使用CTRL + F或其他字母来查找方法
3.更改默认值。
当您找到方法时,将skipna=True
更改为skipna=False
。
完成后,保存文件,它应该工作!
我希望我帮助你:)