重置缺失值权重与列数据归一化的高效方法
在数据分析与数据清洗过程中,我们经常遇到这样一类需求:数据表中包含两个列,一个用于存储权重,另一个用于记录分类标签。现在需要根据分类标签列进行处理——如果该列存在缺失值(NaN),则该行数据的权重应被视为无效,需将其置零。与此同时,剩余的有效权重需要按比例重新缩放,确保调整后的权重总和保持不变,比如仍然为1。
如果采用逐步手动处理的方法——先求和、再缩放 ——不仅代码冗长,还容易在逻辑上绕晕自己。实际上,Pandas 已经提供了简洁且高效的现成方案,可以一步到位完成这类“条件权重重分配”任务。
核心思路非常清晰,只需三步:首先,将缺失标签对应的权重识别出来并“屏蔽”;接着,将这些权重赋值为零;最后,对非零部分的权重进行归一化处理。
这里推荐使用 Series.mask() 配合 Series.div() 来实现,一句代码即可完成。下面是具体实现:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'Type': ['A', np.nan, 'B', 'C', 'D', np.nan],
'wgt': [0.1, 0.2, 0.3, 0.25, 0.1, 0.05]
})
# 一步到位:将 Type 为 NaN 对应的 wgt 置 0,再按剩余权重总和归一化
s = df['wgt'].mask(df['Type'].isna(), 0)
df['new_wgt'] = s.div(s.sum())
执行结果如下:
Type wgt new_wgt 0 A 0.10 0.133333 1 NaN 0.20 0.000000 2 B 0.30 0.400000 3 C 0.25 0.333333 4 D 0.10 0.133333 5 NaN 0.05 0.000000
可以看到,原本第 1 行和第 5 行的权重分别为 0.2 和 0.05,由于对应的 Type 是 NaN,已被全部置零。原始权重总和为 1.0,处理后仅剩 0.75,剩余的四个有效权重被等比例放大,最终总和依然保持为 1.0。整个操作干净利落,完全满足业务需求。
如果希望代码更加简洁,避免引入中间变量 s,也可以采用链式调用配合 pipe 方法:
df['new_wgt'] = df['wgt'].mask(df['Type'].isna(), 0).pipe(lambda x: x / x.sum())
关于这个操作,有几个关键点值得注意:
mask(condition, other)函数的作用是:当condition(条件)为真时,将原值替换为other中的值。此处将缺失标签位置替换为 0,语义清晰且易于理解。isna()是 Pandas 中检测缺失值的标准方法,能够同时识别None和np.nan,不存在兼容性问题。- 使用
div(s.sum())而不是直接/ s.sum(),可以更好地处理索引对齐,在复杂的数据结构下更加安全可靠。 - 需要特别注意的是,此方法的核心是先置零,然后对所有有效权重做线性缩放。因此,如果原始权重列的总和本身不是 1(例如为 0.8),经过处理后新权重列的总和依然为 0.8。如果你希望强制归一化到 1,必须确保输入的权重列已经归一化过,或者显式地除以原始权重的总和。
总体而言,这套组合拳兼具代码可读性、执行性能与逻辑健壮性。在 Pandas 处理“条件权重重分配”这类数据预处理任务时,你很难找到比它更优雅的解法了。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
列表遍历时动态判断阈值并返回相应文本
遍历数值列表时,先筛选满足阈值的元素,再根据结果输出列表或友好提示。推荐使用列表推导式结合条件判断,注意边界用`>=`,空列表自动为假。也可用`any()`提前终止遍历,提升效率。此法简洁,避免显式循环,特别适合阈值筛选。
Maven项目中如何强制使用本地构建的依赖版本
多模块开发中强制使用本地依赖的正确做法是使用-SNAPSHOT版本并配合`-U`参数强制更新,或重构为多模块项目统一管理生命周期。避免使用版本范围语法或手动复制JAR,确保构建行为可靠可重复。
Go语言net.Conn并发写安全与原子性保障解析
Go标准库中net Conn支持并发方法调用,但Write()不保证原子性。多goroutine同时写入时,系统可能拆分数据包,导致内容交错,破坏消息边界。必须使用互斥锁或bufio Writer等显式同步机制确保写操作完整性,不可依赖系统调用本身的原子性。
Python在Windows系统中获取指定卷标U盘驱动器字母的方法
使用Pythonwmi库通过Win32_Volume接口查询Windows系统中卷标为“TOSHIBA”的U盘盘符。需安装wmi和pywin32,注意大小写区分及多设备过滤。仅适用于Windows。
TP6.0消息已读功能基于Redis Bitmap未读计数方案
TP6 0中使用Redis位图实现消息已读标记,每条消息仅占一个比特,内存效率高。需将消息ID映射为连续偏移量,通过SETBIT和GETBIT操作。需提前维护用户ID到偏移量的映射表,注意键过期与驱动类型(phpredis与predis)问题。此方法内存极省,适合海量消息场景,且需确保偏移量唯一。
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
相关攻略
2026-07-08 06:50
2026-07-08 06:50
2026-07-08 06:50
2026-07-08 06:49
2026-07-08 06:49
2026-07-08 06:49
2026-07-08 06:49
2026-07-08 06:49
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

