如何从大型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
相关产品推荐
相关产品推荐

