更改 pandas 函数调用中的默认参数

Changing Default Parameter in pandas function call

在 pandas 中,许多函数采用一长串可选参数,每个参数都有一个默认值。

如果我想在整个项目或至少在整个 py 文件中重新定义默认值,有没有简单的方法可以做到这一点?

例如 read_csv() 默认为 encoding=None,但我希望每次调用 read_csv() 都默认为 UTF-8 编码。

我知道我可以包装这个函数,但是通过单独的自定义导入进行一个 Pandas 调用感觉很难看。加上其他开发人员无疑会回到使用 read_csv().

我知道我可以编辑 pandas 源代码,但就保持兼容性而言,这是一个非常糟糕的主意。

最后显然我可以更新每个 read_csv() 调用以单独设置编码,但在我正在处理的项目中有非常多的编码,正则表达式会很棘手,由于其他可选的非位置参数的可能性。此外,这无助于让未来的开发人员重复同样的问题。

有什么想法吗?

编辑:

MedAli 的答案在文件范围内运行良好。

我一直试图让它在目录范围内工作(我正在使用 Python 2.7):

我相信 if pandas 在标准库中,从标准库导入内容时忽略本地文件很容易: from __future__ import absolute_import

此外,这个看起来很狡猾的 hack 也不起作用:

import sys                                                                                                                                                               
syspath = sys.path                                                                                                                                                        
new_syspath = [path for path in sys.path if path.strip('.')]                                                                                                                                                    
sys.path = new_syspath                                                                                                                                                     
import pandas                                                                                                                                                    
sys.path = syspath

我知道乱用 sys.path 是个坏主意,虽然因为我实际上是在设计时试图完全践踏 pandas,至少一些常见的担忧不适用.

加上下面的评论 - 作为制作数百个之前的测试用例 search/replaces 我认为找到一种方法来屏蔽库而不更改代码是有效的......如果它有效然后使用更少骇人听闻的解决方案。

它开始看起来不可行,即使使用 hack,任何人都可以证明我错了吗?

第二次编辑:

我相当确定你不能做我在第一次编辑中问过的事情,所以我接受了文件范围的答案作为你在 Python.[=19= 中可以做的最好的答案]

就测试 运行 而言,我认为最简单的做法是在应用文件范围级别修复之前临时更改 panadas 中的 parsers.py。

如果有人不这么认为,我仍然很感兴趣!

您可以使用 functools.partial

import pandas as pd 
import functools 

new_read_csv = functools.partial(pd.read_csv, encoding="utf-8")

然后你使用 new_read_csv 就像你使用 pd.read_csv

您也可以覆盖 pd.read_csv 以使用默认参数保存新函数,如下所示:

pd.read_csv = new_read_csv 

如果覆盖后想回到原来的实现:

pd.read_csv = pd.read_csv.func