用组的中值替换数据帧值

Replacing dataframe values by median value of group

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

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

我可以通过将每个标签的 df 拆分为一个 df,对每个 df 进行估算,然后组合来实现这一点,但这种逻辑无法很好地扩展。我最多可以有 20 个 类,我根本不相信这是 'right' 的方法。

我想在不复制我的 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
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