0

我正在处理一些数据,我每小时都会对患者进行观察。在某些情况下,特定患者的某些功能完全是空的。我试图找到一种方法来通过使用恒定平均值来估算数据,该平均值基于具有相同性别和相似年龄的其他 50 名患者的人口子集。我对以下数据进行了简化:

人力资源 O2Sat 温度 血小板 年龄 性别 患者 ID
80 98 36.5 52 1 A0
82 96 37.0 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 20 0 A4
81 92 36.9 20 0 A4

我已经按年龄对数据框进行了重新排序,并且到目前为止拥有此代码

data = data.sort_values(['Age']).groupby(['PatientID','Gender']).apply(lambda x: x.fillna(x.mean()))

但我知道这将使用所有可用数据来找到平均值,但我不确定如何将其限制为 50 名年龄相近的患者。

4

1 回答 1

1

我想我现在得到了你想要的。您想用正确年龄和类别的匹配记录来填补空白。我创建了一个简单的示例进行调试。

df = pd.DataFrame(data=dict(
    category=['A', 'B', 'C'] * 3,
    age=[15, 15, 15, 15, 15, 15, 25, 25, 25],
    measurement=[1, 2, 3, np.nan, 5, np.nan, 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() 您只能选择组中的前几条记录。除非您拥有庞大的数据集,否则我建议您只使用所有数据集,但这取决于您。

于 2021-06-15T13:18:40.533 回答