我有一个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
答案 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)