【问题标题】:Creating a definition that takes undefined number of parameters创建一个采用未定义数量参数的定义
【发布时间】:2020-11-17 22:28:34
【问题描述】:

将如下代码转换为能够接受任意数量的数据帧的最佳方法是什么?

def q_grab(df, df2, df3, q): #accepts three dataframes and a column name. Looks up column in all dataframes and combine to one
    data = df[q], df2[q], df3[q]
    headers = [q+"_1", q+"_2", q+"_3"]
    data2 = pd.concat(data, axis = 1, keys=headers)
    return data2

q = 'covid_condition'
data2 = q_grab(df, df2, df3, q) #If I run function pid_set first, it will create new df based on pID it looks like

【问题讨论】:

    标签: python pandas definition


    【解决方案1】:

    一种方法是使用 * 运算符获取参数列表 (但命名你的最​​后一个参数,所以它不是列表的一部分):

    类似这样的:

    def q_grab(*dfs, q=None): # q is a named argument to signal end of positional arguments
        data = [df[q] for df in dfs]
        headers = [q+"_"+str(i) for i in range(len(dfs))]
        data2 = pd.concat(data, axis = 1, keys=headers)
        return data2
    
    q = 'covid_condition'
    data2 = q_grab(df, df2, df3, q=q)    
    

    一个可能更干净的替代方法是继续传递数据帧列表作为第一个参数:

     def q_grab(dfs,q):
       
    

    调用:

     data2 = q.grab([df,df2,df3], q)
    

    使用上面的功能码

    【讨论】:

    • 谢谢鲁弗斯。这是一个很好的解决方案。我忘记了列表推导会自动在元素之间放置一个逗号
    • 另外,我已经读到 *args 应该始终放在参数的末尾。为什么它是第一位的有什么理由吗?为什么 q= None 而不是将其保留为 q?
    • *args 必须在未命名(位置)参数之后,但在命名参数之前。因此,您可以将参数列表更改为def q_grab(q,*dfs),而无需命名列参数,只需将其放在可变长度列表之前。
    • 我注意到一个小错误。生成标头时,您希望 str(i+1) 而不是 str(i) 提供与原始代码相同的编号。
    猜你喜欢
    • 2015-01-22
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多