【问题标题】:Changing Default Parameter in pandas function call更改熊猫函数调用中的默认参数
【发布时间】:2017-08-04 09:25:17
【问题描述】:

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

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

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

我知道我可以包装函数,但是通过单独的自定义导入来调用 Pandas 感觉很难看。另外,其他开发者无疑会重新使用read_csv()。

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

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

有什么想法吗?

编辑:

MedAli 的答案在文件范围内效果很好。

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

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

而且这个看起来很狡猾的黑客也不起作用:

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,所以至少一些常见的问题不适用。

加上下面的 cmets - 作为进行数百次搜索/替换之前的测试用例,我认为找到一种方法来屏蔽库而不更改代码是有效的......如果它有效,那么采用不那么 hacky 的解决方案。

它开始看起来不可行,即使使用黑客,谁能证明我错了?

第二次编辑:

我相当肯定你不能做我在第一次编辑中提出的问题,所以我接受了文件范围答案作为你在 Python 中可以做的最好的事情。

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

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

【问题讨论】:

  • 没有万无一失的方法不能解决。我只是定义你自己的包装器并让它知道它将encoding参数设置为默认为'utf-8'并保留它。

标签: python python-2.7 pandas python-import


【解决方案1】:

你可以使用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 

【讨论】:

  • 这真的很好 - 但它缺少最后一点 - 然后它想以某种方式将它叠加到 pd.read_csv 上,隐藏原始实现(至少在某种程度上),而不是创建一个新功能。
  • 谢谢 - 是的,这在文件范围内非常有效。有没有办法让它在目录范围甚至项目范围内工作?我正在通过在我的本地源目录中有一个 pandas.py 来探索使用 import shadowing 来覆盖实际的 pandas 导入。然后它会将 * 所有实际的 pandas 导入它自己的命名空间并修改 read_csv ,就像你展示的那样?它似乎不起作用,也许是因为它相当hacky!阴影有效,但我看不到如何使用实际的 pandas 命名空间填充本地 pandas 命名空间?
  • @Phil 我个人倾向于不要在项目独家新闻中这样做,以避免由于版本更改等加班造成的痛苦错误。但是,您所描述的导入阴影可能是一种解决方法。不过我自己没试过..
  • 谢谢 - 我有同样的保留意见,但至少在不进行数百次更改的情况下测试整个项目的更改,我认为这是可以接受的。我是否应该把它留在生产中并不是那么简单!
  • 我仍在尝试让它在目录范围内工作。如果 panadas 是标准库的一部分,则可以解决此问题,但事实证明,这样做非常棘手。在我用尽这个之前,我不想关闭这个问题。我会尽快更新我的问题。
猜你喜欢
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2015-08-05
  • 2012-06-14
  • 1970-01-01
  • 2022-11-15
相关资源
最近更新 更多