【问题标题】:Data Imputation with Mean in PythonPython中均值的数据插补
【发布时间】:2021-06-15 13:02:17
【问题描述】:

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

HR O2Sat Temp Platelets Age Gender PatientID
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 名年龄相近的患者。

【问题讨论】:

  • 你的意思是.groupby(['PatientID','Gender']) 吗?
  • 一种可能的方法是首先计算另一个列,将“年龄相似 + 性别”的患者分类。也许通过 np.where() 的组合,或带有年龄 bin 的映射表。然后您可以将此列放入您的 groupby 中,然后 lambda 函数将传递到该组?

标签: python imputation data-preprocessing


【解决方案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() 您只能选择组中的前几条记录。除非您拥有庞大的数据集,否则我建议您只使用所有数据集,但这取决于您。

【讨论】:

  • 所以这绝对符合我正在寻找的内容,现在它很有意义,但我需要尝试将平均值限制为仅使用年龄相似的 50 人的子集,不是确切的年龄,因为没有足够的数据来做到这一点
  • 已更新,见答案。
猜你喜欢
  • 2017-05-04
  • 2020-08-26
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 2014-01-26
  • 2022-01-14
相关资源
最近更新 更多