熊猫方法的有效参数



Pandas似乎忽略了额外的(无效(参数。例如

import pandas as pd
df=pd.read_excel('myfile.xlsx', some_dummy_param=True)

我期望(但没有收到(类似这样的错误......

TypeError: __init__() got an unexpected keyword argument 'some_dummy_param'

问题是,由于没有错误,我认为"some_dummy_param"是有效的。这当然是意料之中的。有没有办法确保只有有效的参数传递给read_excel方法?

不,不是真的。

关键字参数在Pandas中经常通过**kwargs传递,它要么被转发,要么被视为dict。使用此dict的函数可以自由检查是否有其他键,而不是它们期望的键。

您可以执行以下操作:

def safe_read_excel(self, f_name, *args, **kwargs):
# Check if kwargs contains wrong parameters
if set(kwargs.keys()).difference(set(<expected keys>)): 
raise ValueError(<some messagge>)
return self.read_excel(f_name, *args, **kwargs)
pd.DataFrame.safe_read_excel = safe_read_excel

但是,这将

  1. 为数据帧创建非标准方法
  2. 可能会中断不同版本的熊猫

是的,这不是一个需要解决的小问题。pd.read_excel在其签名中接受**kwargs。这意味着您可以传递您喜欢的任何关键字参数,因为read_excel不会对不需要使用的关键字参数执行任何操作。

解决此问题的一种方法是

  1. 确定read_excel实际接受哪些关键字参数
  2. read_excel构建参数列表
  3. 根据 (1( 的结果过滤掉无效参数
  4. 将筛选的参数列表传递给函数

若要处理 (1(,可以使用inspect模块来确定pd.read_excel接受哪些参数。具体而言,inspect.signature方法返回一个Signature对象,您可以从中查询parameters属性。这将返回一个mappingproxy(实际上是一个不可变的字典(。

import inspect
args = inspect.signature(pd.read_excel).parameters
print(args)
mappingproxy({'convert_float': <Parameter "convert_float=True">,
'converters': <Parameter "converters=None">,
'date_parser': <Parameter "date_parser=None">,
'dtype': <Parameter "dtype=None">,
...})

在这里,假设 (2( 已经完成。但是,在您的情况下,您需要确保潜在参数位于字典中,因为这将非常容易在映射代理和过滤器上相交。

params = {'io' : 'myfile.xlsx', 'some_dummy_param' : True}

步骤 (3( 涉及对键执行设置交集,然后从交集重建新的参数列表。

valid_params = {k : params[k] for k in params.keys() & args.keys()}
print(valid_params)
{'io': 'myfile.xlsx'}

这将形成有效的参数列表 — (4( 的基础。

df = pd.read_excel(**valid_params)

最新更新