我为患者设置了数据集,我想处理这些数据的缺失值,它包含数字和文本,这是我想根据受试者ID处理的想法。不仅基于列替换 数据集看起来像这样
subject_id time heart_rate blood_pressure urine_color
1 1.10 23 60 red
1 2 40
2 3 60 80
2 4 dark yellow
我想用最常见的患者数据替换文本数据,并用患者的平均值替换数字,就像这样
subject_id time heart_rate blood_pressure urine_color
1 1.10 23 60 red
1 2 23 40 red
2 3 60 80 dark yellow
2 4 60 80 dark yellow
任何人都可以帮助解决这一问题,我会搜索所有估算方法,在列中使用频率最高,或者对整个列进行统计分析
答案 0 :(得分:0)
将GroupBy.transform
与具有数字列的mean
的自定义功能一起使用,并将mode
用于分类的列,并用DataFrame.fillna
替换缺少的值:
f = lambda x: x.mean() if np.issubdtype(x.dtype, np.number) else x.mode().iat[0]
每组类别列的所有NaN
值(如果可能):
f = lambda x: x.mean() if np.issubdtype(x.dtype, np.number) else next(iter(x.mode()), None)
cols = df.columns.difference(['subject_id'])
df[cols] = df[cols].fillna(df.groupby('subject_id')[cols].transform(f))
print (df)
subject_id time heart_rate blood_pressure urine_color
0 1 1.1 23 60 red
1 1 2 23 40 red
2 2 3 60 80 dark yellow
3 2 4 60 80 dark yellow