2017-07-02 97 views
1

我有一個熊貓數據框,其中一列sign up有多個空值。該sign up柱具有包括多個OSiOSandroidweb等 我想從現有OS值但NA值填補NA值應該被填充爲每OS值的現有的分配分類值。熊貓:根據現有值的分佈填充NA值要填充

實施例: 可以說,該數據集具有OS的值計數的分佈如下:

signup 
android web 14 
ios web  16 
mac   5 
other   3 
windows  6 
Name: id, dtype: int64 

我想補基於所述不同的OS的值的上述分佈的NA值。我想要做的原因是保持目前的分佈,因爲填充價值可能會扭曲結果。 有人可以幫助如何做到這一點。

回答

4

你可以使用的東西,像NumPy這樣的random.choice

開始使用piRSquared的小費在評論 幀適合您的描述

import numpy as np 
import pandas as pd 

print(df) 
    id signup 
0 1  mac 
1 2  mac 
2 3  mac 
3 4 other 
4 5 other 
5 6 windows 
6 7 windows 
7 8 windows 
8 9 windows 
9 10  NaN 
10 11  NaN 
11 12  NaN 
12 13  NaN 
13 14  NaN 

更新搞清楚的電流分佈

s = df.signup.value_counts(normalize=True) 
print(s) 
windows 0.444444 
mac  0.333333 
other  0.222222 
Name: signup, dtype: float64 

我們將在f旁邊使用布爾索引ilter由我們想要更新的nans。此外,這是我們通過傳遞索引(窗口,mac,其他),所需大小以及每個註冊的分佈將用於概率(p)參數的隨機選擇的地方。

missing = df['signup'].isnull() 
df.loc[missing,'signup'] = np.random.choice(s.index, size=len(df[missing]),p=s.values) 
print(df) 

    id signup 
0 1  mac 
1 2  mac 
2 3  mac 
3 4 other 
4 5 other 
5 6 windows 
6 7 windows 
7 8 windows 
8 9 windows 
9 10 windows 
10 11 windows 
11 12 mac 
12 13 windows 
13 14 other 
+0

好像我們不明白的問題,以同樣的方式,他的註冊列是一個與NaN值? –

+1

感謝鮑勃。這很有幫助。 – user4943236

+1

'df.signup.value_counts(normalize = True)' – piRSquared

1

首先,我把這個作爲輸入(因爲我覺得你的問題,你錯名爲my valuesign up

 signup value 
0 android web 14.0 
1  ios web 16.0 
2   mac 5.0 
3  other 3.0 
4  windows 6.0 
5  ios web NaN 
6   mac NaN 
7  windows NaN 

知道了,你的問題可以在一行來解決如下:

b = df.groupby('signup')['value'].first()[df['signup']] 

請不是b的類型是pandas.Series的

01。

但如果你想你的輸出與同列的數據框名稱進行如下操作:

b = pd.DataFrame(df.groupby('signup')['value'].first()[df['signup']],columns=['value']).reset_index() 
b.rename({1:'value'}) 

如果你print(b),它輸出:

 signup value 
0 android web 14.0 
1  ios web 16.0 
2   mac 5.0 
3  other 3.0 
4  windows 6.0 
5  ios web 16.0 
6   mac 5.0 
7  windows 6.0 
1
  • 找到空
  • 樣本來自非空值的空值。請務必將replace=True
  • 分配採樣值爲null位置

isnull = df.signup.isnull() 
sample = df.signup.dropna().sample(isnull.sum(), replace=True).values 
df.loc[isnull, 'signup'] = sample