我有一个数据帧elec2:
Start_Date End_Date
0 2014-05-16 2015-05-18
1 2015-05-19 2018-05-13
2 2016-05-14 2017-05-12
3 2017-05-13 2018-05-16
4 2018-05-17 2019-05-14
预期输出:
Start_Date End_Date Value
0 2014-05-16 2017-05-18 0
1 2015-05-19 2018-05-13 1
2 2016-05-14 2017-05-12 0
3 2017-05-13 2018-05-16 1
4 2018-05-17 2019-05-14 0
如果start_date从2017年开始,如果2017年在start_date和End_date之间,我想加1,但如果End_date是2017年,那么它是0。
我做了这个,它对第一种情况有效,但我不知道如何治疗其他情况。
elec2["Value"]=elec2.apply(lambda x: 1 if (x["Start_Date"].year==2017)
else
0,axis=1)
谢谢你的帮助。
首先将列转换为DataFrames,通过Series.dt.year
转换为年份,然后通过Series.eq
进行比较以表示相等,Series.gt
表示较大,Series.lt
表示较小,Series.ne
表示不相等:
df['Start_Date'] = pd.to_datetime(df['Start_Date'])
df['End_Date'] = pd.to_datetime(df['End_Date'])
s = df['Start_Date'].dt.year
e = df['End_Date'].dt.year
m1 = s.eq(2017)
m2 = s.lt(2017) & e.gt(2017)
m3 = e.ne(2017)
最后将m1
和m2
与OR
(|
(和m3
链在一起,AND
和&
链在一起并最后通过Series.astype
或Series.view
转换为整数:
df['Value'] = ((m1 | m2) & m3).astype(int)
#alternative
#df['Value'] = ((m1 | m2) & m3).view('i1')
print (df)
Start_Date End_Date Value
0 2014-05-16 2015-05-18 0
1 2015-05-19 2018-05-13 1
2 2016-05-14 2017-05-12 0
3 2017-05-13 2018-05-16 1
4 2018-05-17 2019-05-14 0
与@jezrael的答案略有不同:
df['Value'] = ((pd.DatetimeIndex(df['Start_Date']).year <= 2017) & (pd.DatetimeIndex(df['End_Date']).year > 2017))*1
或者当您的DataFrame
已经是DateTime
对象时:
df['Value'] = ((df.iloc[:, 0].dt.year <= 2017) & (df.iloc[:, 1].dt.year > 2017))*1
您也可以使用.astype(int)
而不是*1
我仍然掌握着Python的窍门,上面的内容可能会更像Python。。。