带放回随机抽样:递增样本量并求和追加至DataFrame
解决方案
核心步骤
要实现带放回抽样、逐次递增样本量并生成汇总结果,需完成以下操作:
- 初始化空容器存储每次抽样的汇总数据
- 循环遍历从1到指定N的样本量
- 抽样时开启带放回模式(
replace=True) - 对抽样结果做id拼接、数值求和及明细格式化
- 将每次的汇总结果整合到最终DataFrame中
完整代码示例
先构造示例中的原始DataFrame:
import pandas as pd # 原始数据集 df = pd.DataFrame({ 'id': ['a', 'b', 'c', 'd'], 'value_1': [5, 10, 6, 9], 'value_2': [10, 30, 8, 12] }) # 指定最大样本量N(示例用3,可改为200) N = 3 result_df = pd.DataFrame(columns=['id\'s', 'sum_of_value_1', 'sum_of_value_2']) for n in range(1, N+1): # 带放回抽样 sampled = df.sample(n, replace=True) # 拼接id字符串 ids_str = ','.join(sampled['id']) # 计算value_1的总和并生成带明细的字符串 sum_v1 = sampled['value_1'].sum() v1_detail = f"{sum_v1} ({'+'.join(map(str, sampled['value_1']))})" # 计算value_2的总和并生成带明细的字符串 sum_v2 = sampled['value_2'].sum() v2_detail = f"{sum_v2} ({'+'.join(map(str, sampled['value_2']))})" # 将当前抽样的汇总结果追加到结果表 result_df.loc[len(result_df)] = [ids_str, v1_detail, v2_detail] print(result_df)
关键细节说明
- 带放回抽样:必须添加
replace=True参数,否则默认是无放回抽样,不符合需求 - 结果追加优化:如果N较大(比如200),直接循环追加DataFrame会有性能损耗,建议改用列表暂存数据,最后一次性转成DataFrame:
# 大N场景优化版本 data_list = [] for n in range(1, 201): sampled = df.sample(n, replace=True) ids_str = ','.join(sampled['id']) sum_v1 = sampled['value_1'].sum() v1_detail = f"{sum_v1} ({'+'.join(map(str, sampled['value_1']))})" sum_v2 = sampled['value_2'].sum() v2_detail = f"{sum_v2} ({'+'.join(map(str, sampled['value_2']))})" data_list.append([ids_str, v1_detail, v2_detail]) result_df = pd.DataFrame(data_list, columns=['id\'s', 'sum_of_value_1', 'sum_of_value_2'])
内容的提问来源于stack exchange,提问作者Barnaby Cooper
相关产品推荐
相关产品推荐

