【问题标题】:Hot Deck Imputation in PythonPython 中的 Hot Deck 插补
【发布时间】:2020-04-19 20:16:19
【问题描述】:

我一直在尝试寻找可以让我替换数据框列中缺失值的 Python 代码。我的分析重点是生物统计学,因此我不习惯使用均值/中值/模式替换值。我想应用"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 函数,该函数允许我输入一列作为参数,并使用“Hot Deck Imputation”方法返回缺失值替换为估算值的列。

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

任何帮助将不胜感激!

【问题讨论】:

  • bfillffill 会这样做吗?这应该是一种“热代码插补”(LOCF)
  • 这两种方法有何不同,我如何知道它们使用了热代码插补?
  • ffill 使用 last observation carried forward LOCF 热代码插补。
  • 是否有更精确的方法来填充缺失值,不包括均值/众数/中位数?

标签: python python-3.x pandas imputation


【解决方案1】:

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

#...
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'])

【讨论】:

  • 是的,请稍等。我将添加示例
  • 我尝试了您分享的代码: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: () got an unexpected keyword argument 'axis'
  • 让我测试一下。
  • 已修复。看到df[['x']]。获取 DataFrame 而不是系列
  • 非常感谢大家的帮助!您能解释一下如何确定“n_neighbors”的最佳值吗?
猜你喜欢
  • 2021-02-07
  • 2018-05-21
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 2022-07-14
相关资源
最近更新 更多