Python 中的 Hot Deck 插补

Hot Deck Imputation in Python

我一直在努力寻找 Python 代码来替换数据框列中的缺失值。我的分析重点是生物统计学,所以我不习惯使用 means/medians/modes 替换值。我想应用 "Hot Deck Imputation" 方法。

我找不到任何在线的 Python 函数或包,它们采用数据框的列并使用 "Hot Deck Imputation" 方法填充缺失值。

不过,我确实看到了这个 GitHub project 并且 没有 发现它有用。

以下是我的一些数据的示例(假设这是一个 pandas 数据帧):

| age | sex | bmi  | anesthesia score | pain level |
|-----|-----|------|------------------|------------|
| 78  | 1   | 40.7 | 3                | 0          |
| 55  | 1   | 25.3 | 3                | 0          |
| 52  | 0   | 25.4 | 3                | 0          |
| 77  | 1   | 44.9 | 3                | 3          |
| 71  | 1   | 26.3 | 3                | 0          |
| 39  | 0   | 28.2 | 2                | 0          |
| 82  | 1   | 27   | 2                | 1          |
| 70  | 1   | 37.9 | 3                | 0          |
| 71  | 1   | NA   | 3                | 1          |
| 53  | 0   | 24.5 | 2                | NA         |
| 68  | 0   | 34.7 | 3                | 0          |
| 57  | 0   | 30.7 | 2                | 0          |
| 40  | 1   | 22.4 | 2                | 0          |
| 73  | 1   | 34.2 | 2                | 0          |
| 66  | 1   | NA   | 3                | 1          |
| 55  | 1   | 42.6 | NA               | NA         |
| 53  | 0   | 37.5 | 3                | 3          |
| 65  | 0   | 31.6 | 2                | 2          |
| 36  | 0   | 29.6 | 1                | 0          |
| 60  | 0   | 25.7 | 2                | NA         |
| 70  | 1   | 30   | NA               | NA         |
| 66  | 1   | 28.3 | 2                | 0          |
| 63  | 1   | 29.4 | 3                | 2          |
| 70  | 1   | 36   | 3                | 2          |

我想应用一个 Python 函数,它允许我输入一个列作为参数,并且 return 使用 [=31= 将具有缺失值的列替换为估算值] 方法。

我使用它是为了使用 Statsmodels.api 对线性和逻辑回归等模型进行统计建模。我没有将其用于机器学习。

如有任何帮助,我们将不胜感激!

您可以使用 ffill,它使用 last observation carried forward (LOCF) 热代码插补。

#...
df.fillna(method='ffill', inplace=True)

Scikit-learn impute 提供了KNN、Mean、Max等插补方法。 (https://scikit-learn.org/stable/modules/impute.html)

# sklearn '>=0.22.x'
from sklearn.impute import KNNImputer

imputer = KNNImputer(n_neighbors=2, weights="uniform")

DF['imputed_x'] = imputer.fit_transform(DF[['bmi']])

print(DF['imputed_x'])