【问题标题】:multiple if conditions in lambda does not work as expectedlambda 中的多个 if 条件无法按预期工作
【发布时间】:2019-03-18 11:12:15
【问题描述】:

我在尝试拼凑多个条件 if 时遇到问题。

  • UDF.daysinmonth(x) 返回一个月的天数
  • latest_date.month 返回日期时间对象的月份(例如 3 表示 2019-3-10) - latest_date=df['offtake_date'].max()
df.insert(loc=20, column='bbls_mbd_mth',value=df['bbls'] / df['offtake_date'].apply(lambda x: UDF.daysinmonth(x) if x.month!=latest_date.month and x.year!=latest_date.year else latest_date.day))

这不起作用,if x.month!=latest_date.month and x.year!=latest_date.year。对于 2019 年全年,它返回数据中的最新日期,而不是过去几个月的天数。对于 2018 年,它运行良好。

这也不行。

df.insert(loc=20, column='bbls_mbd_mth',value=np.nan)
for i, row in df.iterrows():
    ifor_val = df.at[i,'bbls']/latest_date.day
if ((df.at[i,'offtake_date'].month!=latest_date.month) and (df.at[i,'offtake_date'].year!=latest_date.year)):
    ifor_val = df.at[i,'bbls']/(UDF.daysinmonth(df.at[i,'offtake_date']))
df.at[i,'bbls_mbd_mth'] = ifor_val

但是当我翻转逻辑时它会起作用

for i, row in df.iterrows():
    ifor_val = df.at[i,'bbls']/(UDF.daysinmonth(df.at[i,'offtake_date'])
    if ((df.at[i,'offtake_date'].month==latest_date.month) and (df.at[i,'offtake_date'].year==latest_date.year)):
        ifor_val = df.at[i,'bbls']/latest_date.day)
    df.at[i,'bbls_mbd_mth'] = ifor_val

我想我错过了一些真正的基本知识....任何帮助表示赞赏。

【问题讨论】:

  • 我相信你可能有一个尾随 ) 在这一行:ifor_val = df.at[i,'bbls']/latest_date.day) - 你的 if 语句也是冗余分组的。
  • 嗨,卡尔文。很高兴您自己解决了错误。如果可以,您应该将自己的答案标记为正确。此外,我还敦促您将您的代码显示为code。这要清楚得多。许多人立即去寻找问题中的代码,只需通过格式即可。因此,请始终在适用的情况下使用代码格式。这次我为你做了修改。要掌握它,您可以尝试在您给出的答案中格式化您的代码。
  • 谢谢。完毕。还在学习。

标签: python-3.x if-statement lambda


【解决方案1】:

感谢朱利安的及时回复。我发现了我的错误,这是一个逻辑错误。缺少的括号只是错字。

apply(lambda x: UDF.daysinmonth(x) if x.month!=latest_date.month and x.year!=latest_date.year else latest_date.day))

我只想在日期属于最近的月份和年份时才应用 latest_day。通过上面的操作,就和

一样了
apply(lambda x: UDF.daysinmonth(x) if x.year!=latest_date.year else latest_date.day))

不管月份如何,这不是我想要的。我颠倒了逻辑,它奏效了

apply(lambda x: latest_date.day if x.month==latest_date.month and x.year==latest_date.year else UDF.daysinmonth(x)))

【讨论】:

    猜你喜欢
    • 2015-04-21
    • 2019-01-25
    • 2013-12-08
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多