Python 中均值的数据插补

Data Imputation with Mean in 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, 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() ,您只能 select 一组中的前几条记录。除非你有一个庞大的数据集,否则我建议只使用全部,但这取决于你。