首先,您需要计算从每个字数中抽取多少样本。假设“wc”是一个包含“wordCount”和“number”列的数据框:
options = len(wc)
remaining = 2000
wc['how many'] = 0
wc = wc.sort_values('number').reset_index().drop('index', axis=1)
for i in range(options):
wc['how many'][i] = min(wc['number'][i], remaining // (options - i))
remaining -= wc['how many'][i]
“多少”列现在具有您要从每个 wordCount 中采样的数字。然后在您的数据框上,假设命名为“数据”,您应该有一个名为“wordCount”的匹配列,您可以使用以下方法对您需要的数字进行采样:
for i in data['wordCount'].unique():
part_data = data[data['wordCount'] == i]
part_sample = part_data.sample(wc[wc['wordCount'] == i].iloc[0, -1])
try:
all_samples = pd.concat([all_samples, part_sample])
except NameError:
all_samples = part_sample.copy()
最后,“all_samples”应该有 2000 个样本以及您要求的分布。
顺便说一句:在数据帧行上循环通常是一个非常糟糕的主意,它可以被矢量化,但由于它只有 8 行,我允许自己。