我一直在尝试寻找可以让我替换数据框列中缺少的值的Python代码。我的分析重点是生物统计学,因此我不满意使用均值/中位数/模式替换值。我想应用"Hot Deck Imputation"方法。

我找不到在线的任何Python函数或程序包,这些函数或程序包都使用数据框的列并使用“热甲板插补”方法填充缺少的值。

但是,我确实看到了这个GitHub project,但没有发现它有用。

以下是一些数据的示例(假设这是一个熊猫数据框):

| 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函数,该函数允许我输入一列作为参数,并使用“热甲板插补”方法将缺失值替换为插补值的列返回。

我将其用于统计建模的目的,例如使用Statsmodels.api进行线性和逻辑回归的模型。我没有将其用于机器学习。

任何帮助将非常感激!

最佳答案

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

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


Scikit学习插补提供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'])

07-25 21:40