基于分组的Bootstrap重采样实现(针对pandas DataFrame)
基于group_id的Bootstrap重采样实现方法
核心思路
先提取所有唯一的group_id,对这些分组ID做有放回抽样,再将每个抽中的分组对应的所有行取出,拼接成重采样后的DataFrame。
代码实现
1. 构造示例数据
先还原你提供的示例DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({ 'class': [1, 1, 1, 0, 0], 'group_id': [1, 1, 1, 2, 2] })
2. 分步实现重采样
# 1. 获取所有唯一分组ID unique_groups = df['group_id'].unique() # 2. 对分组ID进行有放回抽样(抽样数量与原唯一分组数一致) sampled_groups = np.random.choice(unique_groups, size=len(unique_groups), replace=True) # 3. 拼接抽中分组的所有行 resampled_df = pd.concat([df[df['group_id'] == g] for g in sampled_groups], ignore_index=True)
3. 封装为可复用函数
如果需要多次执行重采样,可以封装成函数:
def bootstrap_resample_by_group(df, group_col): unique_groups = df[group_col].unique() # 可自定义抽样数量,比如size=2*len(unique_groups)生成更大的数据集 sampled_groups = np.random.choice(unique_groups, size=len(unique_groups), replace=True) return pd.concat([df[df[group_col] == g] for g in sampled_groups], ignore_index=True) # 调用函数 resampled_df = bootstrap_resample_by_group(df, 'group_id')
注意事项
- 每次运行结果会有差异,因为是随机抽样;如需固定结果,可在代码开头设置随机种子:
np.random.seed(42) - 可通过修改
np.random.choice的size参数调整重采样后的数据集大小,比如设置为原分组数的2倍,会生成包含重复分组的更大DataFrame
内容的提问来源于stack exchange,提问作者Enes
相关产品推荐
相关产品推荐

