【发布时间】:2021-05-19 15:54:27
【问题描述】:
我有一个这样的数据框:
df
Id Severity First Discovered
0 Low 1/1/2021
1 Medium 1/1/2021
2 Medium 1/1/2021
我还在下面定义了一个函数,它有助于创建“目标关闭日期”,它根据相应的“严重性”值向“首次发现”字段添加一定天数。
def get_target_close_date(severity, first_discovered_date):
'''Adds days to first discovered date depending on severity'''
if severity == 'Low':
target_close_date = first_discovered_date + timedelta(days=30)
elif severity == 'Medium':
target_close_date = first_discovered_date + timedelta(days=60)
return target_close_date
通过执行df['Target Close Date'] = df.apply(lambda row: get_target_close_date(row['Severity'], row['First Discovered']), axis=1),数据框正确更新:
df
Id Severity First Discovered Target Close Date
0 Low 1/1/2021 1/31/2021
1 Medium 1/1/2021 3/2/2021
2 Medium 1/1/2021 3/2/2021
但是,如果数据框为空,则代码不起作用,并且我收到 ValueError: Wrong number of items passed 3, placement 意味着 1。理想情况下,我想在 lambda 函数中添加一个 if else 语句来检查数据框是否为空,例如:
df['Target Close Date'] = df.apply(
lambda row: get_target_close_date(row['Severity'], row['First Discovered']) if not df.empty else pass,
axis=1)
但是,这会一直返回语法错误。我更愿意在 lambda 函数中编写 if else 条件,而不是执行跨越多行的 if else 语句。
【问题讨论】:
-
你希望
... else pass做什么?条件表达式必须计算为 something,所以可能是... else None?无论如何,为什么要专门使用 lambda 表达式? -
好点。我想我只是不希望发生任何事情(即,如果它是一个空数据框,请不要创建目标关闭日期列,因为这会使其失败)。对于您的第二点,lambda 函数在整个脚本中多次用于许多数据帧,每个数据帧具有不同的名称。至少对我而言,查找和替换 lambda 函数内部的内容比创建需要多次引用数据框名称的多行 if else 语句更容易。
标签: python pandas if-statement lambda apply