Python初学者:如何更新函数以运行多个参数
我创建了一个函数,该函数创建了一个pandas数据框,其中我创建了一个新列,该列组合了员工的名字/中间名/姓氏。然后,我基于pythonPython初学者:如何更新函数以运行多个参数,python,dataframe,indexing,Python,Dataframe,Indexing,我创建了一个函数,该函数创建了一个pandas数据框,其中我创建了一个新列,该列组合了员工的名字/中间名/姓氏。然后,我基于python索引(EmployeeID)调用该函数。我能够为一名员工成功运行此功能。我在更新函数以同时运行多个employeeid时遇到问题。假设我想通过函数运行3个员工ID。我将如何更新此函数以允许这样做 def getFullName(EmpID): df = pd.read_excel('Employees.xls', 'Sheet0', index_col=
索引(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
)您收到的错误是什么?另外,请为我们添加一些示例数据以重现错误。