【问题标题】:Creating column to keep track of missing values in another column创建列以跟踪另一列中的缺失值
【发布时间】:2020-01-21 18:59:42
【问题描述】:

我正在添加一个模拟数据框来举例说明我的问题。

我有一个大型数据框,其中某些列缺少值。 我想创建一些额外的布尔列,其中 1 对应于行中的非缺失值,0 对应于缺失值。

names = ['Banana, Andrew Something (Maria Banana)', np.nan, 'Willis, Mr. Bruce (Demi Moore)', 'Crews, Master Terry', np.nan]

room = [100, 330, 212, 111, 222]

hotel_loon = {'Name' : pd.Series(names), 'Room' : pd.Series(room)}

hotel_loon_df = pd.DataFrame(hotel_loon)

在我在stack overflow 上发现的另一个问题中,他们非常彻底并且清楚地知道如何继续跟踪所有具有缺失值但不针对特定值的列。 我尝试了该代码的一些变体(即使用 where),但未能成功创建我想要的内容,如下所示:

                                       Name Room Name_present Room_present
0   Banana, Andrew Something (Maria Banana) 100             1            1 
1                                      NaN  330             0            1
2          Willis, Mr. Bruce (Demi Moore)   212             1            1
3                    Crews, Master Terry    111             1            1
4                                    NaN    222             0            1

感谢您的宝贵时间,我相信最终它会变得微不足道,但由于某种原因我被卡住了。

【问题讨论】:

    标签: python pandas dataframe missing-data


    【解决方案1】:

    您可以为您的案例使用.isnull(),并将类型从bool 更改为int

    hotel_loon_df['Name_present'] = (~hotel_loon_df['Name'].isnull()).astype(int)
    hotel_loon_df['Room_present'] = (~hotel_loon_df['Room'].isnull()).astype(int)
    
    Out[1]: 
                                          Name  Room  Name_present  Room_present
    0  Banana, Andrew Something (Maria Banana)   100             1             1
    1                                      NaN   330             0             1
    2           Willis, Mr. Bruce (Demi Moore)   212             1             1
    3                      Crews, Master Terry   111             1             1
    4                                      NaN   222             0             1
    

    ~ 的意思是相反的,或者不是的东西。

    【讨论】:

    • 这是一个非常棒的解决方案!我非常接近正确的方式,但似乎我一直忘记代字号,感谢您为解除对陌生人的阻止所花费的时间和精力。您是否会建议阅读以使这些概念更加存在?再次感谢您。
    • 欢迎您@bls。 learn python the hard way 是一个很好的来源(无从属关系)。然而,在实际项目中,没有什么比试错更重要的了。
    • 花了最后一个小时浏览它,感谢您为我指出正确的方法!我似乎是一个很好的资源。
    【解决方案2】:

    要节省一些输入,请使用DataFrame.notnull,添加一些后缀,然后将结果连接回来。

    pd.concat([df, df.notnull().astype(int).add_suffix('_present')], axis=1)
    
                                          Name  Room  Name_present  Room_present
    0  Banana, Andrew Something (Maria Banana)   100             1             1
    1                                      NaN   330             0             1
    2           Willis, Mr. Bruce (Demi Moore)   212             1             1
    3                      Crews, Master Terry   111             1             1
    4                                      NaN   222             0             1
    

    【讨论】:

      【解决方案3】:

      如果只跟踪 Nan 字段,可以使用 isnull() 函数。

      df['name_present'] =df['name'].isnull()
      df['name_present'].replace(True,0, inplace=True) 
      df['name_present'].replace(False,1, inplace=True) 
      df['room_present'] =df['room'].isnull()
      df['room_present'].replace(True,0, inplace=True)
      df['room_present'].replace(False,1, inplace=True)
      

      【讨论】:

        【解决方案4】:

        我们可以使用DataFrame.isnull以简洁的方式做到这一点:

        hotel_loon_df[['Name_present', 'Room_present']] = (~hotel_loon_df.isnull()).astype(int)
        
                                              Name  Room  Name_present  Room_present
        0  Banana, Andrew Something (Maria Banana)   100             1             1
        1                                      NaN   330             0             1
        2           Willis, Mr. Bruce (Demi Moore)   212             1             1
        3                      Crews, Master Terry   111             1             1
        4                                      NaN   222             0             1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-19
          • 2017-02-08
          • 2017-06-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多