用组的中值替换数据帧值
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
抱歉,如果这是重复的,我没有找到类似的答案。
大图:我有一个带有 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