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

Python初学者:如何更新函数以运行多个参数,python,dataframe,indexing,Python,Dataframe,Indexing,我创建了一个函数,该函数创建了一个pandas数据框,其中我创建了一个新列,该列组合了员工的名字/中间名/姓氏。然后,我基于python索引(EmployeeID)调用该函数。我能够为一名员工成功运行此功能。我在更新函数以同时运行多个employeeid时遇到问题。假设我想通过函数运行3个员工ID。我将如何更新此函数以允许这样做 def getFullName(EmpID): df = pd.read_excel('Employees.xls', 'Sheet0', index_col=

我创建了一个函数,该函数创建了一个pandas数据框,其中我创建了一个新列,该列组合了员工的名字/中间名/姓氏。然后,我基于python
索引(EmployeeID)
调用该函数。我能够为一名员工成功运行此功能。我在更新函数以同时运行多个
employeeid
时遇到问题。假设我想通过函数运行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")

您可以添加一个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")

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

在本例的实践中,由于python是动态类型的,而且数据帧的类型也可以将值列表作为参数,因此您不必更改任何内容。只需将员工ID列表作为
EmpID
传递即可

如果不知道empid是什么样子,就很难给出一个例子

但是您可以通过使用调用函数来尝试

getFullName(EmpID)

getFullName([EmpID, EmpID])
第一次通话应将记录打印一次,第二行应将记录打印两次。您可以用任何工作id替换
EmpID
(请参见
df.index

我喜欢的上面有一些小例子可以玩

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

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

不管怎样,df.index:中的
if EmpID将需要重写。我建议您传递一个名为
employee_ID
的列表作为输入,然后执行以下操作(前两行是在列表中封装单个ID,仅当您仍然希望能够传递单个ID时才需要):

如果不存在(员工ID,列表):
employee_id=[employee_id]#这确保您仍然可以传递单个id
rec=df.reindex(employee_id).EmployeeName.dropna()
在过去,
df.loc
会接受缺少的标签,只是不返回任何内容,但在最近的版本中,它会引发一个错误。
reindex
会为
employee\u ID
中的每个ID提供一行,如果ID不在索引中,则将
NaN
作为值。因此,我们选择列
EmployeeName
a然后用
dropna
删除缺失的值

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

因此:

def getFullName(员工ID):
df=pd.read_excel('Employees.xls','Sheet0',index_col='EmployeeID',usecols=['EmployeeID','FirstName','MiddleName','LastName',na_值=['')
X=df[[“名字”、“中间名”、“姓氏”]]
df['EmployeeName']=X.fillna('').apply(lambda X:X.LastName+“,+X.FirstName+”“+str(X.MiddleName),axis=1)
如果不存在(员工ID,列表):
employee_id=[employee_id]#这确保您仍然可以传递单个id
rec=df.reindex(employee_id).EmployeeName.dropna()
如果记录为空:
打印(“未知”)
其他:
打印(记录值)

(顺便说一句,您可能想知道python的惯例是对函数和变量名使用
snake\u case
,对类名使用
CamelCase

您收到的错误是什么?另外,请为我们添加一些示例数据以重现错误。