2017-02-27 11 views
1

以下のダミーデータがあれば、私の目標は従業員が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 

これを達成するために、次のリストを作成しました。

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'])] 

「false」を取得したJames以外のすべての従業員に対して正しいブール値が返されます。

hire < pd.Timestamp(2014, 12, 31) and termination == pd.NaT

が、これは括弧の問題やpd.Natの選択である:確かに、彼はこの条件を満たしているとして、彼は、 '真' に割り当てられていないのはなぜ

df[df['name'] == 'James']

name hire_date termination_date grade_2014 active_end_2014 
James 1999-01-01 NaT     10.0  false 

?あるいは、私はどのようにしてもっと広く包括的にリストを構築していますか?

+0

「pd.NaT」は分かりませんが、「NaN」、「NaN == NaN」のようなものは偽を返します。 – polku

答えて

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

をあなたがFalseになります==、ナンのを比較しています。 pd.isnullを使用してください。

>>> pd.NaT == pd.NaT 
False 
>>> pd.isnull(pd.NaT) 
True 
関連する問題