代码之家  ›  专栏  ›  技术社区  ›  Jasper

pandas:。apply函数为整个列提供单个值[重复]

  •  0
  • Jasper  · 技术社区  · 7 年前

    假设我有以下数据帧:

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

    但结果是一样的。

    我觉得我错过了一个非常明显的错误,但对于我来说,我无法理解为什么它不能工作。有人知道我做错了什么吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   BENY    7 年前
    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)
    
        2
  •  2
  •   DYZ    7 年前

    价值 nan 不是数字 不能与其他数字相比。特别地, nan==nan 不是真的(也不是 nan!=nan )

    在您的情况下,使用 apply 甚至没有必要。就这么做吧 df['has_id_dummy'] = df['ID'].notnull().astype(int)