【问题标题】:Multiple Elifs based on Different Factors基于不同因素的多个 Elif
【发布时间】:2019-01-17 00:15:03
【问题描述】:

我有一个带有 int 列年、月和日的 pands df。我想以最 Pythonic 的方式创建一个新列 df.is_payday,即 df.day 为 20 或 30 时为 1,否则为 0。

但是,有些月份没有 30 天,所以在这些情况下,我希望 df.is_payday 只有在 df.day 为 20 或 29 时才为 1,否则为 0。

但是,有些月份甚至没有 28 天,所以在这些情况下,我希望 df.is_payday 只有在 df.day 为 20 或 28 时才为 1,否则为 0。

这可以通过列表理解来完成吗?这也可以使用日历或日期时间模块根据月天数来完成吗?

编辑

我已经成功使用了下面的代码,虽然我更愿意使用 Pythonic:

lst = []
for i,k in zip(df['day'], df['month_total_days']):
    if i == 20 | i == 30 & k >= 30:
        lst.append(1)
    elif i == 20 | i == 29 & k == 29:
        lst.append(1)
    elif i == 20 | i == 28 & k == 28:
        lst.append(1)
    else:
        lst.append(0)
df['is_payday'] = lst

【问题讨论】:

  • 我使用了以下内容,这很有效,但是我更愿意使用 pythonic 的东西: lst = [] for i,k in zip(df['day'], df['month_total_days'] ): 如果我 == 20 | i == 30 & k >= 30: lst.append(1) elif i == 20 | i == 29 & k == 29: lst.append(1) elif i == 20 | i == 28 & k == 28: lst.append(1) else: lst.append(0)

标签: python-3.x pandas calendar list-comprehension


【解决方案1】:

我认为您可以使用np.where 找到df.day 等于20 的位置,并根据情况获得28、29 和30 的值,实际上是df.day 等于df.month_total_days , 除非 df.month_total_days 超过 30,因此您可以使用 pd.clip_upper 来获得 30 而不是任何超过的值。

import numpy as np

df['is_payday'] = np.where( (df.day == 20) | 
                            (df.day == df.month_total_days.clip_upper(30), 1, 0)

【讨论】:

    猜你喜欢
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2021-11-28
    • 2012-11-17
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多