首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:用基础分布替换值

Python:用基础分布替换值
EN

Stack Overflow用户
提问于 2017-07-29 23:00:19
回答 3查看 125关注 0票数 1

我有一个数据框,其中一列有3个值,即0.0,1.0和35.0。基本上,35.0是空值,但不知何故,空值被解释为35.0。值计数如下所示:

代码语言:javascript
复制
home_ownership
0.0      1090
1.0     38531
35.0      379
Name: Id, dtype: int64

我需要根据现有的0和1分布,将我所有的35.0替换为0或1。

如果有任何建议,我将不胜感激。

EN

回答 3

Stack Overflow用户

发布于 2017-07-29 23:17:42

给定您的数据分布,您可以使用简单的随机数生成

代码语言:javascript
复制
>> n_zeros, n_ones = 1090, 38531
>> n_samples = n_zeros + n_ones
>> n_nulls = 379
>> df.loc[np.isclose(df['home_ownership'], 35.0), 'home_ownership'] = \
         [float(random.randint(0, n_samples) >= n_zeros) for _ in range(n_nulls)]

说明:float(random.randint(0, n_samples) >= n_zeros)从分布{0.0: n_zeros/n_samples, 1.0: n_ones/n_samples}生成随机数。

注意:您可以替换

代码语言:javascript
复制
[float(random.randint(0, n_samples) >= n_zeros) for _ in range(n_nulls)]

使用

代码语言:javascript
复制
np.random.choice([0.0, 1.0], n_nulls, p=[n_zeros/n_samples, n_ones/n_samples])

或使用

代码语言:javascript
复制
np.random.binomial(1, n_ones/n_samples, n_nulls).astype(float)
票数 1
EN

Stack Overflow用户

发布于 2017-07-30 13:26:14

在不对每个组的大小进行硬编码或导入任何新内容的情况下,您可以通过利用sample方法来实现:

代码语言:javascript
复制
n = home_ownership.shape[0]
valid_subset = home_ownership[home_ownership.col!=35.0]
distribution = valid_subset.col.sample(n, replace=True).values
home_ownership.col.where(home_ownership.col!=35.0, other=distribution, inplace=True)

array

  • distribution是从0和1中挑选出来的大小相同的数组(使用replacement).

  • Keep
  • 不是35的所有值,否则使用代表性分布中的相应值。
票数 1
EN

Stack Overflow用户

发布于 2017-07-29 23:14:44

考虑以下方法:

代码语言:javascript
复制
sm = 1090+38531

df.loc[np.isclose(df.a, 35.), 'a'] = np.random.choice([0.,1.], 379, p=[1090/sm, 38531/sm])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45390695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档