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

千敏同学_3643

千敏同学_3643

2026-07-26

991人浏览

原创

高效实现大规模 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 万簇数据上耗时 (单线程,普通服务器配置):

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)

? 为什么更快?

魔搭GPT(ModelScopeGPT)
魔搭GPT(ModelScopeGPT)

魔搭GPT(ModelScopeGPT)是一款AI视频创作工具,阿里达摩院推出的大小模型协同的智能助手,具备作诗、绘画、视频生成、语音播放等多模态能力。

下载
  • 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() 替代手动遍历判断多条件存在性。

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

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

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

下载

相关标签:

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

相关专题

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

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

2026.04.24

335

29

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

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

2025.12.04

300

15

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

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

2026.01.31

212

21

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

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

2026.04.13

371

25

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

0

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

0

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

0

12

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

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

2026.09.30

0

26

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

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

2026.09.29

0

15

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习