2017-07-29 26 views
1

我有一個數據框,其中一列有3個值,即0.0,1.0,& 35.0。基本上,35.0是空值,但不知何故,空值被解釋爲35.0。價值數看起來象下面這樣:Python:用基礎分佈代替值

home_ownership 
0.0  1090 
1.0  38531 
35.0  379 
Name: Id, dtype: int64 

我需要根據0和1的基本現有的銷售,以取代我所有的35.0與0或1。

將不勝感激任何指針。

回答

0

考慮以下方法:

sm = 1090+38531 

df.loc[np.isclose(df.a, 35.), 'a'] = np.random.choice([0.,1.], 379, p=[1090/sm, 38531/sm]) 
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

介意分享您的邏輯 – user4943236

+0

@ user4943236添加了一些說明 – tarashypka

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) 
  • n是您的陣列的形狀
  • 分佈是從0和1的(與替換)拾取相同的尺寸的陣列。
  • 保留所有不是35的值,否則使用代表性分佈中的相應值。