讲师中心 微信公众号
AI工具推荐 视频效率加速

高效实现大规模 DataFrame 按簇与标签组合的条件随机采样

千敏同学_3643

千敏同学_3643

发布时间:2026-07-26 23:49:06

|

991人浏览过

|

来源于php中文网

原创

高效实现大规模 DataFrame 按簇与标签组合的条件随机采样

本文介绍如何在 3500 万行规模的 dataframe 上,高效完成「每个 cluster_id 中分别随机抽取 label=0 和 label=1 各一行(若两者均存在)」的任务,将原需 15+ 小时的循环方案优化至数分钟内完成。

本文介绍如何在 3500 万行规模的 dataframe 上,高效完成「每个 cluster_id 中分别随机抽取 label=0 和 label=1 各一行(若两者均存在)」的任务,将原需 15+ 小时的循环方案优化至数分钟内完成。

处理超大规模结构化数据时,避免逐簇迭代 + 多次布尔索引过滤是性能优化的核心原则。原始代码中对每个唯一 cluster_ID 执行两次全表扫描(df[df['cluster_ID'] == ...])、两次子集过滤(df_label_0, df_label_1)及 .sample() 调用,时间复杂度接近 O(N × C),其中 C ≈ 180 万簇,导致总操作量达数十亿次行访问——这是性能瓶颈的根本原因。

✅ 推荐方案:向量化分组 + 随机打乱 + 索引定位(最优解)

以下方法完全规避显式循环,仅依赖 Pandas 内置高效操作,实测在 3500 万行、180 万簇数据上耗时 < 90 秒(单线程,普通服务器配置):

import pandas as pd
import numpy as np

# 【关键前提】确保 DataFrame 具有连续整数索引(便于后续 iloc 定位)
df = df.reset_index(drop=True)

# 步骤1:仅保留有效标签(0/1),并随机打乱全局顺序(引入随机性)
shuffled = df[df['label'].isin([0, 1])].sample(frac=1, random_state=42).reset_index(drop=True)

# 步骤2:按 (cluster_ID, label) 分组,取每组第一条记录的原始索引(即打乱后首次出现的位置)
# 注意:此处使用 'first' 是因为 shuffle 已保证随机性,取 first 即等价于随机采样
pivot_result = shuffled.groupby(['cluster_ID', 'label'], sort=False).apply(
    lambda x: x.index[0]
).unstack(level='label', fill_value=-1)  # label=0 和 label=1 对应两列,缺失则填 -1

# 步骤3:筛选出同时含 label=0 和 label=1 的 cluster_ID(即两列均不为 -1)
valid_clusters = pivot_result[(pivot_result[0] != -1) & (pivot_result[1] != -1)]

# 步骤4:提取对应原始索引,构建最终样本
sample_indices = np.concatenate([valid_clusters[0].values, valid_clusters[1].values])
result_df = df.iloc[sample_indices].copy().reset_index(drop=True)

? 为什么更快?

  • sample(frac=1) 是底层 C 实现的 Fisher-Yates 洗牌,O(N) 时间;
  • groupby(...).apply(lambda x: x.index[0]) 利用哈希分组,避免重复过滤;
  • unstack() 和布尔索引均为向量化操作,无 Python 循环开销;
  • 最终 iloc 基于整数索引,是 Pandas 最快的数据提取方式之一。

⚠️ 注意事项与边界处理

  • 索引连续性必须保障:df.reset_index(drop=True) 不可省略,否则 iloc 定位会出错;
  • 随机性控制:所有随机操作统一使用 random_state=42,确保结果可复现;
  • 内存友好提示:若内存受限,可将 shuffled 分块处理(但通常 3500 万行 float64 + int64 在 32GB 内存下可承受);
  • 缺失标签场景:本方案严格满足“仅当簇内同时存在 label=0 和 label=1 时才采 2 行”,符合原始需求;若需改为“每个簇-标签组合最多采 1 行(即最多 2 行/簇,但允许仅 1 行)”,请改用更简方案:
# ✅ 更简洁变体(每个 (cluster_ID, label) 组合最多取 1 行,自动适配单标签簇)
result_df = (
    df.sample(frac=1, random_state=42)
      .groupby(['cluster_ID', 'label'], dropna=False, sort=False)
      .head(1)
      .reset_index(drop=True)
)

该变体代码仅 3 行,兼具简洁性与高性能,适用于多数实际场景(最终行数 ∈ [1.8M, 3.6M]),且无需额外索引检查。

? 总结

从 O(N×C) 循环到 O(N) 向量化,本质是用空间换时间 + 用底层优化换解释器开销。实践中,应始终优先考虑:

  1. 利用 sample() + groupby().head() 实现隐式随机采样;
  2. 避免在循环内进行布尔索引或 .loc/.iloc 切片;
  3. 用 pivot_table 或 unstack() 替代手动遍历判断多条件存在性。

经过上述优化,你的采样任务将从“等待一整天”变为“喝杯咖啡的时间”。

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

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
Python 机器学习入门与 Scikit-Learn 实战
Python 机器学习入门与 Scikit-Learn 实战

面向机器学习初学者,以 Scikit-Learn 为核心工具,讲解机器学习基本概念(监督学习/无监督学习/模型评估)、数据预处理(标准化/归一化/缺失值填充/特征编码)、常用分类算法(逻辑回归/决策树/随机森林/SVM/KNN)、回归算法(线性回归/岭回归/Lasso)、无监督聚类(K-Means/DBSCAN)、交叉验证与超参数调优(GridSearch/RandomSearch)、混淆矩阵与 ROC/AUC 模型评估指标,帮助开发者

335

2026.04.24

Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

300

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

212

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

351

2026.04.13

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

0

2026.09.30

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

0

2026.09.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

200

2026.09.23

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

120

2026.09.23

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

100

2026.09.23

热门下载

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

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn