熊猫:条件语句不能按预期工作

时间:2017-02-27 10:17:48

标签: python pandas

鉴于以下虚拟数据,我的目标是确定一名员工是否在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的选择?或者也许我如何更广泛地构建列表组合?

2 个答案:

答案 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