熊猫:.apply函数给整列单一值

2024-10-04 01:28:48 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下数据帧:

ID  |  has_id_dummy
-----------------------
 340         NaN
 NaN         NaN
 NaN         NaN
 200         NaN

我想把它变成这个数据帧:

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

但结果是一样的

我觉得我错过了一个非常明显的错误,但我的生活不能明白为什么它不会工作。有人知道我做错了什么吗


Tags: 数据lambda函数iddfreturnifdef
2条回答

nan不是一个数字,不能与其他数字比较。尤其是nan==nan不是真的(也不是nan!=nan

在您的例子中,甚至没有必要使用apply。只要做df['has_id_dummy'] = df['ID'].notnull().astype(int)

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)

相关问题 更多 >