0

我有一个带有标准化百分比信息的数据框。例如。

wordCount 数字 百分比

2.0 1282 0.267345

1.0 888 0.185213

3.0 1124 0.170791

4.0 1250 0.152877

5.0 554 0.084864

6.0 333 0.058904

7.0 160 0.024290

8.0 111 0.016851

所有百分比的总和为 1。数据框为 6000 个条目。我希望从中抽取 2000 个样本。2000 样品应尽可能平衡。

它应包括最多的少量百分比数据和最少的大量百分比数据。

我不知道该怎么做。

例如。2000 拥有来自 wordCount 8.0 的所有数据,并且拥有来自 2.0 的最小数据。

当我绘制伽马分布时,线应尽可能平坦。

4

1 回答 1

0

首先,您需要计算从每个字数中抽取多少样本。假设“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 行,我允许自己。

于 2019-08-19T08:32:47.753 回答