pandas对outcome变量分层随机抽样报KeyError:0如何解决
代码错误原因
原代码抛出KeyError: 0由3处核心错误导致:
random.choices()接收过滤后的DataFrame作为输入时,迭代DataFrame默认返回列名而非行数据,返回结果是列名组成的列表,不存在DataFrame的.index属性,调用时直接触发键错误。- 循环内
idx.extend(selectedlist)传入的是固定的类别名称列表,没有存入实际抽样得到的行索引,逻辑完全不符合预期。 - 手动调用标准库random做DataFrame抽样没有利用pandas内置方法,容易出现索引对齐问题,抽样逻辑可靠性差。
正确实现代码
直接用pandas内置的sample()方法做分层抽样,不需要额外引入random库,写法简洁且结果稳定:
# 定义待抽样的类别列表、单类别抽样量 selected_list = ["Major_effect", "Minor_Effect", "Moderate Effect"] sample_per_class = 2288 sampled_index = [] for class_name in selected_list: # 筛选对应类别的子集,抽样指定数量 # 若类内总样本不足2288,添加replace=True参数开启有放回抽样即可 class_subset = df8[df8["outcome"] == class_name] sampled_res = class_subset.sample(n=sample_per_class, random_state=123) sampled_index.extend(sampled_res.index.tolist()) # 提取抽样后的最终数据集,重置索引 df8_sampled = df8.loc[sampled_index].reset_index(drop=True)
参数说明:
random_state为固定随机种子,传入任意整数可保证每次运行抽样结果一致,方便复现;不需要固定结果可以删除该参数。
内容的提问来源于stack exchange,提问作者Omid Mehrpour
相关产品推荐
相关产品推荐

