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
用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)
| 归档时间: |
|
| 查看次数: |
1197 次 |
| 最近记录: |