2

抱歉,如果这是重复,我没有找到类似的答案。

大图:我有一个带有 NaN 值的 df,我想用该列的估算中值替换它。但是,我发现 sklearn 中的内置输入器使用整个列的中值(或任何度量)。我的数据有标签,我想用仅属于该标签的其他样本中的该列的中值替换每个 NaN 值。

我可以通过将 df 拆分为每个标签的一个 df,对每个 df 进行插补,然后组合来做到这一点,但是这种逻辑不能很好地扩展。我最多可以上 20 节课,但我根本不相信这是“正确”的做法。

我想在不复制我的 df 的情况下执行此操作,方法是在拆分-应用-组合技术(或您认为可行的其他技术)中使用 groupby 对象。我感谢您的帮助。

示例 df:

   r1  r2   r3   label
0  12  NaN  58       0
1  34  52   24       1
2  32   4  NaN       1
3   7  89    2       0
4  22  19   12       1

在这里,我希望 (0, r2) 处的 NaN 值等于标签 0 的该列的中值,即值 89(来自 3, r2)。

我希望 (2,r3) 处的 NaN 值等于标签 1 的该列的中值,即中值 (24, 12) 或 18。

成功结果示例:

   r1  r2   r3   label
0  12   89  58       0
1  34  52   24       1
2  32   4   18       1
3   7  89    2       0
4  22  19   12       1
4

1 回答 1

0
In [158]: df.groupby('label', group_keys=False) \
            .apply(lambda x: x.fillna(x.median()).astype(int))
Out[158]:
   r1  r2  r3  label
0  12  89  58      0
3   7  89   2      0
1  34  52  24      1
2  32   4  18      1
4  22  19  12      1

或使用transform

In [149]: df[['label']].join(df.groupby('label')
                               .transform(lambda x: x.fillna(x.median())).astype(int))
Out[149]:
   label  r1  r2  r3
0      0  12  89  58
1      1  34  52  24
2      1  32   4  18
3      0   7  89   2
4      1  22  19  12
于 2017-07-26T20:41:35.080 回答