Python 中的 Hot Deck 插补

4

我一直在试图找到Python代码,以允许我替换数据框中列中的缺失值。我的分析重点在生物统计方面,因此我不舒服使用平均数/中位数/众数替换值。我想应用"Hot Deck Imputation"方法。

我无法找到任何Python函数或在线包以获取数据框的列,并使用“Hot Deck Imputation”方法填充缺失值。

但是,我看到了这个GitHub项目,并且没有发现它有用。

以下是我的一些数据示例(假设这是一个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函数,可以将列作为参数输入,并返回使用“热卡盘插补”方法替换缺失值的列。
我将在统计建模中使用此功能,例如使用Statsmodels.api的线性和逻辑回归模型。我不会用于机器学习。
非常感谢任何帮助!

应该使用 bfill 还是 ffill?哪一个应该是“热代码插补”(LOCF)的一种类型? - Sayandip Dutta
这两种方法有什么不同,我怎么知道它们使用了热代码插补? - Zakariah Siyaji
ffill 使用 last observation carried forward(LOCF)热代码插补。 - Prayson W. Daniel
有没有更精确的方法来填补缺失值,而不包括均值/众数/中位数? - Zakariah Siyaji
1个回答

3
你可以使用ffill函数,它使用最后观察值前向填充(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'])

1
是的,请等一下。我会加上示例。 - Prayson W. Daniel
我尝试了你分享的代码: impute = KNNImputer(n_neighbors=2, weights="uniform") DF['imputed_x'] = DF['bmi'].apply(lambda y: impute.fit_tranform(y),axis=0) print(DF['imputed_x'])但是我遇到了以下错误: TypeError: <lambda>() got an unexpected keyword argument 'axis' - Zakariah Siyaji
1
让我来测试一下。 - Prayson W. Daniel
1
已修复。请查看 df[['x']]。现在获取的是 DataFrame 而不是 Series。 - Prayson W. Daniel
非常感谢您的所有帮助!您能否请解释如何确定“n_neighbors”的最佳值? - Zakariah Siyaji
1
这取决于您的数据。尝试使用其他填充器,例如具有不同策略(中位数、最常见值等)的SimpleImputer,看看您会得到什么结果。 - Prayson W. Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接