微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决np.random.choice 向量化时不返回正确的权重

感谢@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]})

数据集有一个包含用户性别的字符串列:“M”代表男性,“F”代表女性,还有一些我想插补的空值。我使用非空值的 value_counts() 获得了“M”和“F”的权重: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",0.344])

这会引发错误

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

第二次尝试:

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

这会估算空值,但会降低“M”的权重并增加“F”的权重:value_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])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。