代码之家  ›  专栏  ›  技术社区  ›  alofgran mrry

有条件替换NaN

  •  3
  • alofgran mrry  · 技术社区  · 7 年前

    这里是Python新手。我希望我的问题不是完全多余的——如果是,请告诉我,并归咎于我在StackOverflow方面的经验不足。

    无论如何,我正在使用卡格尔的泰坦尼克号数据集。com,我希望使用一组条件语句来替换整个数据帧的Age列中的NaN“value”。最终,我希望根据以下条件生成结果: 1) 如果年龄==NaN,标题==(X或Y或Z),则生成0-18范围内的随机数 2) 如果年龄==NaN,标题==(A或B或C),则生成19-80范围内的随机数

    注:“标题”是一列,其中列出了个人的标题(即先生、夫人、勋爵等)

    我发现了类似的情况 here ,但我无法将其适应我的情况,因为它根本不接近条件性。

    这是我最近的一次尝试(根据此更新的回复)

    尝试1

    import random
    
    mask_young = (df.Age.isnull()) & (df.Title.isin(Title_Young)) 
    df.loc[mask_young, 'Age'] = df.loc[mask_young, 'Age'].apply(lambda x: np.random.randint(0,18))
    
    mask_old = (df.Age.isnull()) & (df.Title.isin(Title_Old)) 
    df.loc[mask_old, 'Age'] = df.loc[mask_old, 'Age'].apply(lambda x: np.random.randint(18,65))
    
    mask_all = (df.Age.isnull()) & (df.Title.isin(Title_All)) 
    df.loc[mask_all, 'Age'] = df.loc[mask_all, 'Age'].apply(lambda x: np.random.randint(0,65))
    

    结果没有错误,但未更正“年龄”列中的NaN值

    1 回复  |  直到 7 年前
        1
  •  5
  •   ALollz    7 年前

    您希望屏蔽数据帧,然后仅对数据帧中与您的条件匹配的部分执行该操作。

    import numpy as np
    import pandas as pd
    
    mask1 = (df.Age.isnull()) & (df.Title == 'Master')
    df.loc[mask1, 'Age'] = df.loc[mask1, 'Age'].apply(lambda x: np.random.randint(0,18))
    

    如果您确实需要在列表中包含多个标题的功能,可以通过定义您关心的标题列表,然后使用 isin 。例如:

    list1 = ['Master', 'Sir', 'Mr']
    mask1 = (df.Age.isnull()) & (df.Title.isin(list1))