繁体   English   中英

初学者 Python:如何更新函数以通过它运行多个参数

[英]Beginner Python: how to update function to run multiple arguments through it

我创建了一个创建 Pandas 数据框的函数,我在其中创建了一个新列,该列结合了员工的名字/中间名/姓氏。 然后我根据 python index(EmployeeID)调用函数。 我能够为一名员工成功运行此功能。 我在更新函数以能够同时运行多个EmployeeIDs时遇到问题。 假设我想通过该函数运行 3 个员工 ID。 我将如何更新此功能以允许这样做?

def getFullName(EmpID):
    df = pd.read_excel('Employees.xls', 'Sheet0', index_col='EmployeeID', usecols=['EmployeeID','FirstName','MiddleName','LastName'] ,na_values=[""])
    X = df[["FirstName","MiddleName","LastName"]]
    df['EmployeeName'] = X.fillna('').apply(lambda x: x.LastName+", "+x.FirstName+" "+str(x.MiddleName), axis=1)
    if EmpID in df.index:
        rec=df.loc[EmpID,'EmployeeName']
        print(rec)
    else:
        print("UNKNOWN")

一般来说,如果您希望一个参数能够由一个或多个记录组成,您可以使用列表或元组来表示它。

在本示例的实践中,因为 python 是动态类型的,并且因为 Pandas Dataframes 的.loc函数也可以将值列表作为参数,所以您不必更改任何内容。 只需将员工 ID 列表作为EmpID传递即可。

在不知道 EmpID 的样子的情况下,很难举一个例子。

但是你可以尝试一下,通过调用你的函数

getFullName(EmpID)

getFullName([EmpID, EmpID])

第一次调用应该向您打印一次记录,第二行应该向您打印两次记录。 您可以将EmpID替换为任何工作 ID(请参阅df.index )。

我喜欢上面的文档有一些最小的例子可以玩。

PS:将列表传递给.loc有一点危险。 如果您传递一个不存在的EmpID ,pandas 目前只会给出警告(在未来版本中,它会给出KeyError 。对于任何未知的 EmpID,它将在结果中创建一个新行,以 NaN 作为值。来自文档示例:

df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['max_speed', 'shield'])

df.loc[['viper', 'sidewinder']]

将返回

            max_speed  shield
viper               4       5
sidewinder          7       8

用缺失的索引调用它:

print(df.loc[['viper', 'does not exist']])

会产生

                max_speed  shield
viper                 4.0     5.0
does not exist        NaN     NaN

您可以添加一组 EmpID。

empID_list = [empID01, empID02, empID03] 

然后你需要使用 for 循环:

for empID in empID_list:
    doStuff()

或者您只是将您的功能用作 for 循环中的函数。

for empID in empID_list:
    getFullName(empID)

假设您有以下员工 ID 列表:

empIDs = [empID1, empID2, empID3] 

然后,您需要将此列表作为参数而不是单个员工 ID 传递。

def getFullName(empIDs):
    df = pd.read_excel('Employees.xls', 'Sheet0', index_col='EmployeeID', usecols=['EmployeeID','FirstName','MiddleName','LastName'] ,na_values=[""])
    X = df[["FirstName","MiddleName","LastName"]]
    df['EmployeeName'] = X.fillna('').apply(lambda x: x.LastName+", "+x.FirstName+" "+str(x.MiddleName), axis=1)
    for EmpID in empIDs:
        if EmpID in df.index:
            rec=df.loc[EmpID,'EmployeeName']
            print(rec)
        else:
            print("UNKNOWN")

if EmpID in df.index:if EmpID in df.index:一种或另一种方式需要重写。 我建议你传递一个名为employee_ids的列表作为输入,然后执行以下操作(前两行是将单个ID包装在一个列表中,仅当您仍然希望能够传递单个ID时才需要):

if not isinstance(employee_ids, list):
    employee_ids = [employee_ids]  # this ensures you can still pass single IDs

rec=df.reindex(employee_ids).EmployeeName.dropna()

在过去, df.loc会接受丢失的标签并且不返回任何内容,但在最近的版本中它会引发错误。 reindex将为employee_ids每个 ID 提供一行,如果 ID 不在索引中,则使用NaN作为值。 因此,我们选择列EmployeeName ,然后使用dropna删除缺失值。

现在,唯一要做的就是处理输出。 DataFrame有一个名为empty的(布尔值)属性,可用于检查是否找到了任何 ID。 否则,我们将要打印recs的值,它是一个Series

因此:

def getFullName(employee_ids):
    df = pd.read_excel('Employees.xls', 'Sheet0', index_col='EmployeeID', usecols=['EmployeeID','FirstName','MiddleName','LastName'] ,na_values=[""])
    X = df[["FirstName","MiddleName","LastName"]]
    df['EmployeeName'] = X.fillna('').apply(lambda x: x.LastName+", "+x.FirstName+" "+str(x.MiddleName), axis=1)

    if not isinstance(employee_ids, list):
        employee_ids = [employee_ids]  # this ensures you can still pass single IDs

    rec=df.reindex(employee_ids).EmployeeName.dropna()
    
    if rec.empty:
        print("UNKNOWN")
    else:
        print(rec.values)

snake_case说一句,您可能想知道 Python 约定是使用snake_case作为函数名和变量名,使用CamelCase作为类名)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM