基于不同因素的多个Elif

时间:2019-01-17 00:15:04

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

我有一个ind列,分别是年,月和日的df。我想以尽可能多的Python方式创建新列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

1 个答案:

答案 0 :(得分:0)

我认为您可以使用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)