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 一组中的前几条记录。除非你有一个庞大的数据集,否则我建议只使用全部,但这取决于你。
我正在处理一些数据,我每小时都会对患者进行观察。在某些情况下,特定患者的某些特征完全是空的。我正在尝试找到一种方法,通过使用基于 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 一组中的前几条记录。除非你有一个庞大的数据集,否则我建议只使用全部,但这取决于你。