[英]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.