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方法?
答案 0 :(得分:5)
不,不是真的。
关键字参数通常通过**kwargs
在Pandas中传递,该转发或转发或视为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 :(得分:1)
是的,这不是一个需要解决的微不足道的问题。 pd.read_excel
在其签名中接受**kwargs
。这意味着您可以传递任何关键字参数,因为read_excel
不会对其不需要使用的关键字参数执行任何操作。
解决此问题的一种方法是
read_excel
实际上接受read_excel
要处理(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)已经完成。但是,在您的情况下,您需要确保您的潜在参数在字典中,因为这将使真正容易在mappingproxy和filter上相交。
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)