如何用循环从Pandas DataFrame按不同数量抽取无放回随机样本?
解决Pandas无放回抽样的列表存储问题
错误原因
你初始化的sample是空列表,sample[i]试图访问第i个元素,但此时列表中没有任何元素,因此触发IndexError。Python的列表完全可以存储DataFrame,和R的列表用法一致,只是你用错了元素添加方式。
正确实现方式
方式1:各次抽样独立(基于原DataFrame)
如果每次抽样都从完整的原数据中抽取无放回样本(不同批次样本可能重叠),可以直接用append向列表添加DataFrame:
number = [10,20,30,40,50] sample = [] for n in number: # replace=False 确保无放回抽样,默认就是False,可省略 sample.append(data.sample(n=n, replace=False))
或者用更简洁的列表推导式:
number = [10,20,30,40,50] sample = [data.sample(n=n, replace=False) for n in number]
方式2:全局无放回抽样(依次从剩余数据抽取)
如果需要所有批次的样本完全不重复(第一次抽10条后,从剩余数据抽20条,以此类推),需要每次抽样后移除已选中的样本:
number = [10,20,30,40,50] sample = [] remaining_data = data.copy() # 复制原数据,避免修改原始DataFrame for n in number: sampled_df = remaining_data.sample(n=n, replace=False) sample.append(sampled_df) # 从剩余数据中删除已抽中的样本 remaining_data = remaining_data.drop(sampled_df.index)
注意:这种方式要求原DataFrame的行数≥150(10+20+30+40+50),否则会因数据不足报错。
内容的提问来源于stack exchange,提问作者Programming Noob
相关产品推荐
相关产品推荐

