假设我有以下数据框:
ID | has_id_dummy
-----------------------
340 NaN
NaN NaN
NaN NaN
200 NaN
我想把它变成这个DataFrame:
ID | has_id_dummy
-----------------------
340 1
NaN 0
NaN 0
200 1
为此,我提出了以下功能:
def dummypopulator(x):
if x != np.nan:
return 1
return 0
我用以下一行打电话
df['has_id_dummy'] = df['ID'].apply(dummypopulator)
但是所有行的值都设置为1,即使是没有ID的行也应该为0.
ID | has_id_dummy
-----------------------
340 1
NaN 1
NaN 1
200 1
我尝试用一个单独的lambda来调用函数,就像我在一个例子中看到的那样:
df['has_id_dummy'] = df['ID'].apply(lambda x: dummypopulator(x))
然而结果是一样的。
我觉得我错过了一个非常明显的错误,但对于我的生活,我无法弄清楚为什么它不会工作。有谁知道我做错了什么?
答案 0 :(得分:2)
值nan
不是数字,无法与其他数字进行比较。特别是,nan==nan
不是True(nan!=nan
}也不是。
在您的情况下,甚至不需要使用apply
。只需df['has_id_dummy'] = df['ID'].notnull().astype(int)
。
答案 1 :(得分:2)
def dummypopulator(x):
if ~np.isnan(x):
return 1
else :
return 0
df['ID'].apply(dummypopulator)
Out[256]:
0 1
1 0
2 0
3 1
Name: ID, dtype: int64
原因:
np.nan!=np.nan
Out[257]: True
我对这个问题的看法
df['ID'].notnull().astype(int)