【问题标题】:Replace NaN with a random value every row每行用一个随机值替换 NaN
【发布时间】:2018-11-08 23:01:25
【问题描述】:

我有一个包含“Self_Employed”列的数据集。在这些列中是值“是”、“否”和“NaN”。我想用 calc() 中计算的值替换 NaN 值。我尝试了一些我在这里找到的方法,但我找不到适用于我的方法。 这是我的代码,我把我尝试过的东西放在 cmets 中。:

    # Handling missing data - Self_employed
SEyes = (df['Self_Employed']=='Yes').sum()
SEno = (df['Self_Employed']=='No').sum()

def calc():
    rand_SE = randint(0,(SEno+SEyes))
    if rand_SE > 81:
        return 'No'
    else:
        return 'Yes'


> # df['Self_Employed'] = df['Self_Employed'].fillna(randint(0,100))
> #df['Self_Employed'].isnull().apply(lambda v: calc())
> 
> 
> # df[df['Self_Employed'].isnull()] = df[df['Self_Employed'].isnull()].apply(lambda v: calc())  
> # df[df['Self_Employed']]
> 
> # df_nan['Self_Employed'] = df_nan['Self_Employed'].isnull().apply(lambda v: calc())
> # df_nan
> 
> #  for i in range(df['Self_Employed'].isnull().sum()):
> #      print(df.Self_Employed[i]


df[df['Self_Employed'].isnull()] = df[df['Self_Employed'].isnull()].apply(lambda v: calc())
df

现在我用 df_nan 尝试的那一行似乎可以工作,但是我有一个单独的集合,其中只有以前的缺失值,但我想填充整个数据集中的缺失值。对于我遇到错误的最后一行,我链接到它的屏幕截图。 你明白我的问题吗?如果是,你能帮忙吗?

This is the set with only the rows where Self_Employed is NaN

This is the original dataset

This is the error

【问题讨论】:

    标签: python pandas data-cleaning


    【解决方案1】:

    确保 SEno+SEyes != null 使用 .loc 方法设置 Self_Employed 为空时的值

    SEyes = (df['Self_Employed']=='Yes').sum() + 1
    SEno = (df['Self_Employed']=='No').sum()
    
    def calc():
        rand_SE = np.random.randint(0,(SEno+SEyes))
        if(rand_SE >= 81):
            return 'No'
        else:
            return 'Yes'
    
    df.loc[df['Self_Employed'].isna(), 'Self_Employed'] = df.loc[df['Self_Employed'].isna(), 'Self_Employed'].apply(lambda x: calc())
    

    【讨论】:

    • 这成功了!我感谢你的帮助。为什么要 +1?
    • 以防万一 SEno+SEyes == 0 因为 np.random.randint(0,0) 不起作用
    【解决方案2】:

    df['Self_Employed'] = df['Self_Employed'].fillna(calc()) 呢?

    【讨论】:

    • 这只是执行 calc() 一次并将其用于每一行,而不是每行进行计算。我希望 NaN 用 Yes 和 No 半随机填充。
    【解决方案3】:

    您可以先确定NaNs 的位置

    na_loc = df.index[df['Self_Employed'].isnull()]
    

    计算您的列中NaNs 的数量,例如

    num_nas = len(na_loc)
    

    然后生成相应数量的随机数,方便索引和设置

    fill_values = pd.DataFrame({'Self_Employed': [random.randint(0,100) for i in range(num_nas)]}, index = na_loc)
    

    最后在你的数据框中替换这些值

    df.loc[na_loc]['Self_Employed'] = fill_values
    

    【讨论】:

    • 所以这实际上确实填充了我打算在我的 df 中的 NaN,但它也确实将与预期 NaN 行相同的行中的所有其他值替换为 NaN。因此,例如第 11 行现在是:NaN NaN NaN NaN NaN No NaN NaN NaN NaN NaN。
    • 那是因为我忘记在assign语句中选择Self_Employed列。现已更正
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 2017-08-14
    • 2020-05-16
    • 1970-01-01
    • 2012-06-13
    相关资源
    最近更新 更多