np.random.cation矢量化时未返回正确的权重



感谢@tdelaney指导我的第一篇文章,我不得不编辑它:

import pandas as pd
import numpy as np
# This is a hypothetical line to generate a df with a column similar to the one which I'm having trouble with:
dataset_2021 = pd.DataFrame({"genero_usuario":["M", "M", None, "F", None, "F", "M", None, "M", "M", None, "F", "F", "M", None, "M", "M", None, "F", None, "F", "M", None, "M", "M", None, "F", "F", "M", None, "M", "M", None, "F", None, "F", "M", None, "M", "M", None, "F", "F", "M", None, "M", "M", None, "F", None, "F", "M", None]})

数据集具有一个字符串列,该列具有用户的性别:";M〃;对于男性和"男性";F";对于女性,我想加上一些零。我得到了";M〃;以及";F";使用非null的value_counts((:M=0.656,F=0.344(这是来自我的数据集,我写的测试给出了0.6和0.4(

下面的代码行工作得很好,当有一个足够大的数据集时,它会返回正确的权重(在上面给出的小测试数据集中,它会稍微改变它(。问题是,由于我的df的大小,执行它需要太长时间:

dataset_2021["genero_usuario"] = dataset_2021["genero_usuario"].apply(lambda x : x if pd.isnull(x) == False else np.random.choice(a = ["M","F"], p=[0.656,0.344]))

我想使用的更快的矢量化版本不起作用。第一次尝试:

dataset_2021.loc[dataset_2021.genero_usuario.isnull(), dataset_2021.genero_usuario] = np.random.choice(a = ["M","F"], p=[0.656,0.344])

这引发了错误:

Cannot mask with non-boolean array containing NA / NaN values

第二次尝试:

dataset_2021.fillna(value = {"genero_usuario" : np.random.choice(a = ["M","F"], p=[0.656,0.344])}, inplace = True)

这估算了零,但减少了"零"的权重;M〃;并且增加了";F":counts((得到M 0.616和F 0.384。

  1. 为什么第一次尝试会抛出那个错误
  2. 为什么第二次尝试会改变最终重量?对于lambda,它保持相等
  3. 我该如何解决?我不想使用lambda,我希望代码保持快速

提前感谢

np.random.choice返回一个值,因此您将相同的值分配给所有空单元格。

因此,您必须首先找到所有空值,并生成足够的随机值来填补所有空白:

mask = dataset_2021["genero_usuario"].isnull()
dataset_2021["genero_usuario"][mask] = np.random.choice(size=mask.sum(), a=["M", "F"], p=[0.716, 0.284])

最新更新