我有一个数据框,其中一列有3个值,即0.0,1.0& 35.0。基本上,35.0是空值但不知何故空值被解释为35.0。值计数如下所示:
home_ownership
0.0 1090
1.0 38531
35.0 379
Name: Id, dtype: int64
我需要根据0和1的基础现有分布将所有35.0
替换为0或1。
不胜感激。
答案 0 :(得分:1)
根据您的数据分布,您可以使用简单的随机数生成
>> 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}
生成随机数。
注意:您可以替换
[float(random.randint(0, n_samples) >= n_zeros) for _ in range(n_nulls)]
与
np.random.choice([0.0, 1.0], n_nulls, p=[n_zeros/n_samples, n_ones/n_samples])
或
np.random.binomial(1, n_ones/n_samples, n_nulls).astype(float)
答案 1 :(得分:1)
如果不对每个组的大小进行硬编码或导入任何新组,您可以通过使用示例方法来实现:
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)
答案 2 :(得分:0)
考虑以下方法:
sm = 1090+38531
df.loc[np.isclose(df.a, 35.), 'a'] = np.random.choice([0.,1.], 379, p=[1090/sm, 38531/sm])