pandas方法的有效参数

时间:2018-05-14 05:14:59

标签: python pandas

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方法?

2 个答案:

答案 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. 为DataFrame创建非标准方法
  2. 可能会破坏不同版本的Pandas

答案 1 :(得分:1)

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

解决此问题的一种方法是

  1. 确定哪些关键字参数read_excel 实际上接受
  2. read_excel
  3. 构建参数列表
  4. 根据(1)
  5. 的结果过滤掉无效参数
  6. 将过滤后的参数列表传递给函数
  7. 要处理(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)