Python根据频率填充缺失值

Pou*_*del 11 python numpy pandas

我已经看到很多情况下缺失值要么由均值或中位数填充。我想知道我们如何用频率填充缺失值。

这是我的设置:

import numpy as np
import pandas as pd


df = pd.DataFrame({'sex': [1,1,1,1,0,0,np.nan,np.nan,np.nan]})
df['sex_fillna'] = df['sex'].fillna(df.sex.mode()[0])
print(df)
   sex  sex_fillna
0  1.0         1.0  We have 4 males
1  1.0         1.0
2  1.0         1.0
3  1.0         1.0
4  0.0         0.0  we have 2 females, so ratio is 2
5  0.0         0.0
6  NaN         1.0  Here, I want random choice of [1,1,0]  
7  NaN         1.0  eg. 1,1,0 or 1,0,1 or 0,1,1 randomly
8  NaN         1.0

Run Code Online (Sandbox Code Playgroud)

有没有通用的方法可以做到这一点?

我的尝试

df['sex_fillan2'] = df['sex'].fillna(np.random.randint(0,2)) # here the ratio is not guaranteed to approx 4/2 = 2
Run Code Online (Sandbox Code Playgroud)

注意 此示例仅适用于二进制值,我正在寻找具有两个以上类别的分类值。

例如:

class: A   B   C
       20% 40% 60%
Run Code Online (Sandbox Code Playgroud)

然后,C我不想按类别填充所有 nan,而是根据频率计数填充。

但是,这是个好主意吗?

根据一些评论,用不同行的不同值估算缺失值可能是也可能不是一个好主意,我在 CrossValidated 中创建了一个问题,如果您想提供一些输入或查看这是否是一个好主意,请访问页面:https : //stats.stackexchange.com/questions/484467/is-it-better-to-fillnans-based-on-frequency-rather-than-all-values-with-mean-or

WeN*_*Ben 6

value_counts+检查np.random.choice

s = df.sex.value_counts(normalize=True)
df['sex_fillna'] = df['sex']
df.loc[df.sex.isna(), 'sex_fillna'] = np.random.choice(s.index, p=s.values, size=df.sex.isna().sum())
df
Out[119]: 
   sex  sex_fillna
0  1.0         1.0
1  1.0         1.0
2  1.0         1.0
3  1.0         1.0
4  0.0         0.0
5  0.0         0.0
6  NaN         0.0
7  NaN         1.0
8  NaN         1.0
Run Code Online (Sandbox Code Playgroud)

sindex的输出是类别,值是概率

s
Out[120]: 
1.0    0.666667
0.0    0.333333
Name: sex, dtype: float64
Run Code Online (Sandbox Code Playgroud)