np.random.choice 向量化时未返回正确的权重

np.random.choice not returning correct weights when vectorized

感谢@tdelaney 指导我完成我的第一个 post,我不得不对其进行编辑:

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”代表女性,其中有一些我想估算的空值。我用非空值的 value_counts() 获得了“M”和“F”的权重:M = 0.656,F = 0.344(这是来自我的数据集,我写的测试给出了 0.6 和 0.4 )

以下代码行完美运行,并且 returns 在拥有足够大的数据集时权重正确(在上面给出的小测试数据集中,它稍微改变了它)。问题是,由于我的 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”的权重:value_counts() 给出 M 0.616 和 F 0.384。

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

提前致谢

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

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

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