在 python 中使用均值、中位数以外的插补缺失值

数据挖掘 特征工程 缺失数据 数据插补
2022-02-24 06:07:17

我听说平均值,中位数不是估算缺失值的最佳方法,为什么会这样?

在我的场景中,我有这样的数据

Brand|Value
A|2,
A|NaN,
A|4,
B|8,
B|NaN,
B|10,
C|9,
C|11

如果使用平均插补,数据将是

Brand|Value
A|2,
A|7.3,
A|4,
B|8,
B|7.3,
B|10,
C|9,
C|11

这对于品牌 B 为 7.3 确实有意义,但如果品牌 A 为 7.3 则没有意义,因为品牌 A 的价值倾向于在 2 和 8 左右有没有其他方法来填补基于品牌的缺失值?

这是一个只有 2 个特征的数据示例,其中 1 个特征可能具有缺失值的模式,如果有 20 个特征怎么办,并且会有多个特征可能具有更好地定义缺失值的模式。

如何在 Python 中应用它?

2个回答

因此,如果您想根据它们所属的组(在您的情况下为 A、B、... )估算一些缺失值,您可以使用groupbyPandas DataFrame 的方法。因此,请确保您的数据在其中一个。

import pandas as pd
df = pd.DataFrame(your_data)              # read documentation to achieve this

然后,这只是将几个步骤链接在一起的情况:

df["Value"] = df.groupby("Brand")["Value"].transform(lambda x: x.fillna(x.mean()))
  • df.groupby简单地将数据帧分组为子数据帧(组),使得每个组只包含一个Brand
  • transform()将函数应用于数据框 - 因此应用于创建的每个单独组groupby
  • 无名函数(一个 lambda 函数)在每个数据帧上调用 DataFrame 的fillna()方法,仅使用mean()来填补空白

您可以简单地将mean()方法替换为您喜欢的任何内容。如果需要,您还可以创建一个更复杂的函数,并替换该lambda 函数它只需要将数据框作为输入并返回具有可比较的数据框index

什么是我要估算​​的列不是数字?

场景如下:

数据框中有 3 列 col1、col2 和 col3。col1 缺少一些行。我想用 col2 和 col3 匹配值的其他行中的 col1 值填充这些缺失值。我怎样才能做到这一点?

示例:如何用 A 填充 row3:col1 中的 NaN,因为 row3:col2 和 col3 匹配 row1:col2 和 col3

xxxx col1 col2 col3 row1 A 1 11 row2 B 2 22 row3 NaN 1 11 row4 C 3 33