You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从大型DataFrame生成多个不相交随机样本并计算样本和?

解决不相交随机样本求和问题

要避免样本重复使用,核心思路是先打乱整个数据集,再将其分割成多个不重叠的批次,每个批次作为一个样本计算求和,这样能保证所有样本的数据完全不相交。

修改后的代码(两种实现方式)

方式一:手动切片(直观易懂)

import polars as pl
import numpy as np

df = pl.DataFrame(
    {"a": np.random.random(1000)}
)

N_samples = 50
N_logs = 20

# 打乱全部数据,保证随机性
shuffled_df = df.sample(fraction=1.0, shuffle=True)

# 分割成不相交的样本并计算每个样本的和
sums = []
for i in range(N_samples):
    # 计算每个样本的起始和结束索引
    start_idx = i * N_logs
    end_idx = start_idx + N_logs
    # 切片获取当前样本
    sample = shuffled_df.slice(start_idx, N_logs)
    # 计算求和并加入结果列表
    sums.append(sample.select(pl.col("a").sum()).item())

方式二:Polars向量化分组(高效简洁)

适合处理大型DataFrame,利用Polars的内置分组操作提升效率:

import polars as pl
import numpy as np

df = pl.DataFrame(
    {"a": np.random.random(1000)}
)

N_samples = 50
N_logs = 20

# 打乱数据后,通过行索引分组实现分割
sums = (
    df.sample(fraction=1.0, shuffle=True)
    .with_row_index()  # 添加行索引列
    .group_by(pl.col("index") // N_logs)  # 按每N_logs行一组分组
    .agg(pl.col("a").sum())  # 计算每组的和
    .select("a")
    .to_series()
    .to_list()  # 转换为列表格式
)

关键说明

  • 先通过sample(fraction=1.0, shuffle=True)打乱整个数据集,确保样本的随机性。
  • 两种方式都依赖总数据量等于样本数×单样本大小(示例中1000=50×20),如果数据量无法整除,可根据需求舍弃剩余数据或调整样本数量。
  • 向量化分组的方式避免了循环切片的开销,在处理超大型DataFrame时性能更优。

内容的提问来源于stack exchange,提问作者Galedon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:52:34