如何解决Python中的均值数据插补
我正在处理一些数据,其中每小时对患者进行一次观察。在某些情况下,特定患者的某些特征完全是空的。我试图找到一种方法,通过使用基于 50 名具有相同性别和相似年龄的其他患者的人口子集的恒定平均值来估算数据。我已经简化了以下数据:
人力资源 | O2Sat | 温度 | 血小板 | 年龄 | 性别 | 患者 ID |
---|---|---|---|---|---|---|
80 | 98 | 36.5 | NaN | 52 | 1 | A0 |
82 | 96 | 37.0 | NaN | 52 | 1 | A0 |
82 | 100 | 36.3 | 160 | 53 | 1 | A1 |
90 | 93 | 36.6 | 165 | 53 | 1 | A1 |
83 | 95 | 35.9 | 140 | 23 | 0 | A2 |
79 | 98 | 36.2 | 155 | 23 | 0 | A2 |
88 | 92 | 36.6 | 163 | 60 | 0 | A3 |
90 | 91 | 36.3 | 165 | 60 | 0 | A3 |
81 | 95 | 37.1 | NaN | 20 | 0 | A4 |
81 | 92 | 36.9 | NaN | 20 | 0 | A4 |
我已经按年龄重新排序了数据框,并且到目前为止有这个代码
data = data.sort_values(['Age']).groupby(['PatientID','Gender']).apply(lambda x: x.fillna(x.mean()))
但我知道这将使用所有可用数据来找到平均值,但我不确定如何将其限制为 50 名年龄相仿的患者。
解决方法
我想我现在得到了你想要的。您想用正确年龄和类别的匹配记录来填补空白。我创建了一个简单的调试示例。
df = pd.DataFrame(data=dict(
category=['A','B','C'] * 3,age=[15,15,25,25],measurement=[1,2,3,np.nan,5,7,8,9]))
df['age_bucket'] = pd.cut(df['age'],bins=np.arange(0,100,10))
agg = df.groupby(['category','age_bucket']).head(2).groupby(['category','age_bucket'])['measurement'].mean()
df = df.set_index(['category','age_bucket'])
df['measurement'] = df['measurement'].fillna(agg)
我更新了答案。如果将年龄转换为年龄桶,则会得到相似的年龄。使用 .head() 您只能选择组中的前几条记录。除非您拥有庞大的数据集,否则我建议您使用所有数据集,但这取决于您。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。