Pandas:.apply函数给出整列的单值

时间:2018-05-21 22:38:23

标签: python pandas

假设我有以下数据框:

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

然而结果是一样的。

我觉得我错过了一个非常明显的错误,但对于我的生活,我无法弄清楚为什么它不会工作。有谁知道我做错了什么?

2 个答案:

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