鉴于以下虚拟数据,我的目标是确定一名员工是否在2014年底受雇并返回一个新的布尔列。
name hire_date termination_date grade_2014
James 1999-01-01 NaT 10.0
Amara 2015-12-07 NaT NaN
Haj 2012-08-13 2016-04-04 9.0
Bill 1999-01-12 2014-02-04 7.0
我写了以下列表comp来实现这一点。
from itertools import izip
df['active_end_2014'] = ['true' if
(hire < pd.Timestamp(2014, 12, 31) and termination == pd.NaT) |
(termination > pd.Timestamp(2015, 1, 1) and grade_2014 != np.nan)
else 'false' for grade_2014, termination, hire in izip(df['grade_2014'],
df['termination_date'],
df['hire_date'])]
为所有员工返回正确的布尔值,但詹姆斯获得“假”。
df[df['name'] == 'James']
name hire_date termination_date grade_2014 active_end_2014
James 1999-01-01 NaT 10.0 false
为什么他没有被指定为“真实”,因为他确实满足了这个条件:
hire < pd.Timestamp(2014, 12, 31) and termination == pd.NaT
这是括号中的问题还是pd.Nat
的选择?或者也许我如何更广泛地构建列表组合?
答案 0 :(得分:2)
您应该正确使用boolean indexing:
In [81]: df['active_end_2014'] = \
...: ((df.hire_date < '2014-12-31') & df.termination_date.isnull()) | \
...: ((df.termination_date > '2015-01-01') & df.grade_2014.notnull())
In [82]: df
Out[82]:
name hire_date termination_date grade_2014 active_end_2014
0 James 1999-01-01 NaT 10.0 True
1 Amara 2015-12-07 NaT NaN False
2 Haj 2012-08-13 2016-04-04 9.0 True
3 Bill 1999-01-12 2014-02-04 7.0 False
答案 1 :(得分:1)
您正在将NaN与==
进行比较,结果为False。使用pd.isnull
。
>>> pd.NaT == pd.NaT
False
>>> pd.isnull(pd.NaT)
True