如何在Python中利用Pandas的sample实现带权重的随机抽样?

老丽同学_2460

老丽同学_2460

2026-08-22

545人浏览

原创

sample()支持带权重抽样,要求weights必须是与dataframe/series行数严格对齐的非负数值序列(list/array/series),不能含nan或负数,长度不匹配、含非法值或传入列名均会报错。

如何在python中利用pandas的sample实现带权重的随机抽样?

sample() 的 weights 参数到底怎么用?

直接说结论:sample() 支持带权重抽样,但要求 weights 参数必须是与 DataFrame 或 Series 行数严格对齐的数值序列(list、array 或 Series),且不能含 NaN 或负数。传入字符串列名会报 KeyError,传 None 或空序列会直接抛 ValueError。

常见错误现象:TypeError: 'str' object cannot be interpreted as an integer(误把列名当权重数组传)、ValueError: weights sum to zero(权重全为 0 或含负值)、IndexError: too many indices for array(权重长度不匹配)。

  • weights 必须和抽样对象的行数一致,比如 df.sample(n=10, weights=df['score']) 是合法的,但 df.sample(n=10, weights='score') 会报错
  • 权重会被自动归一化,所以不需要手动除以总和;但若含 inf、nan 或负数,会立即失败
  • 如果原始数据索引不连续(比如经过 drop 或切片),weights 仍需按位置顺序对齐,不是按索引标签对齐

如何从分类列生成有效权重?

实际中权重常来自某列的数值(如点击量、评分),但也可能来自类别分布——比如想让“高优先级”类别被抽到的概率翻倍。这时不能直接用 pd.get_dummies(),而要用映射构造数值权重序列。

使用场景:平衡类别抽样、按业务规则倾斜采样(如广告日志中付费用户权重设为 3,免费用户设为 1)。

python-parallelization
python-parallelization

将顺序 Python 代码转换为并行/并发实现,用于在需要并行化 Python 代码、提升性能时使用。

下载
  • 用 map() 构建权重:df['priority'].map({'high': 3, 'medium': 1, 'low': 0.5}),注意返回值必须全为数字
  • 避免用 replace() 后直接传入,因为若存在未映射的值会变成 NaN,导致 sample() 失败
  • 若需动态计算(如按频次倒数加权),先用 value_counts(normalize=False) 得到计数,再做 1 / count 映射回原 DataFrame

sample() 带权重时的随机性与 reproducibility

sample() 默认使用全局随机状态,但带权重时对 random_state 更敏感:相同 seed 下,即使权重微小浮点误差(如 0.3333333333333333 vs 1/3)也可能导致不同结果。这不是 bug,而是底层 numpy.random.Generator.choice 的行为。

  • 务必显式指定 random_state(整数或 np.random.Generator 实例),否则每次运行结果不可复现
  • 若权重来自浮点运算(如归一化后的概率),建议用 np.round(weights, 10) 截断,减少精度扰动
  • 不要依赖 seed() 全局设置——sample() 不读取它,只认 random_state 参数

性能陷阱:大数据量下 weights 的开销在哪?

当 DataFrame 超过 10 万行,sample(weights=...) 比无权重慢 3–5 倍,瓶颈不在权重计算,而在底层 choice(..., p=...) 的 O(n) 累积概率构建。这不是 Pandas 层能绕过的。

  • 避免在循环里反复调用带权重的 sample();可先生成足够大的权重抽样索引池,再分批取
  • 若只是需要「近似加权」,考虑先用 groupby().apply(lambda x: x.sample(...)) 分组均匀抽,再按组大小加权拼接——速度更快,逻辑更可控
  • 极端情况(千万级数据 + 高频抽样)建议换用 numpy.random.choice 手动处理索引,跳过 Pandas 的校验开销

权重抽样的核心约束其实就一条:你给的 weights 必须是一个确定的、无缺失、非负、长度匹配的数值序列。其余所有问题,基本都源于没盯住这四个条件中的某一个。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1731

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4384

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1709

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

25657

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3127

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3147

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1183

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2443

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习