选项还不是选项
似乎没有什么这样的option https://pandas.pydata.org/pandas-docs/stable/user_guide/options.html#available-options来控制这种行为。它是硬编码的:
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 https://softwareengineering.stackexchange.com/a/305962/316969了解详情)。
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()
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 代码本身。