随机将数据帧分成具有均匀分布值的组

我有两个组(A和B)的数据框,在这些组中,有 6 个子组(、、、、、a和)。示例数据如下:bcdef


index   group    subgroup    value

0       A        a           1

1       A        b           1

2       A        c           1

3       A        d           1

4       A        e           1

5       A        f           1

6       B        a           1

7       B        b           1

8       B        c           1

9       B        d           1

10      B        e           1

11      B        f           1

...     ...      ...         ...

虽然我在这里只列出了 12 行等于 1 的值,但实际上真实数据集中有 300 行(值等于 2、3 等)。我正在尝试将数据框随机分成 6 批,每批 50 个值。但是,我希望每批包含均匀分布的group值(因此 25 个 A 和 25 个 B)和大致均匀分布的subgroup值。


例如,batch_1 可能包含:


25 A's,其中包含 4 a's、5 b's、4 c's、4 d's、5 e's 和 3 f's。和 25 B's,其中包含 5 a's、4 b's、3 c's、5 d's、4 e's 和 4 f's。


这 6 个批次将分配给 1 个用户。(所以我实际上需要将数据帧随机拆分为多个不同的6 个批次以供更多用户使用。)但我无法判断这是否是数据帧应该随机拆分或采样的问题。有没有人对如何实现这一目标有建议?

PIPIONE
浏览 103回答 1
1回答

喵喔喔

使用一些技巧用于pd.factorize()将分类数据转换为每个类别的值计算代表组/子组对的值/因子f随机化一点np.random.uniform(),最小值和最大值接近 1一旦有一个代表分组的值,就可以sort_values()并且reset_index()有一个干净的有序索引最终通过整数余数进行分组group = list("ABCD")subgroup = list("abcdef")df = pd.DataFrame([{"group":group[random.randint(0,len(group)-1)],  "subgroup":subgroup[random.randint(0,len(subgroup)-1)], "value":random.randint(1,3)} for i in range(300)])bins=6dfc = df.assign(    # take into account concentration of group and subgroup    # randomise a bit....    f = ((pd.factorize(df["group"])[0] +1)*10 +             (pd.factorize(df["subgroup"])[0] +1)             *np.random.uniform(0.99,1.01,len(df))        ),).sort_values("f").reset_index(drop=True).assign(    gc=lambda dfa: dfa.index%(bins)).drop(columns="f")# check distribution ... used plot for SOdfc.groupby(["gc","group","subgroup"]).count().unstack(0).plot(kind="barh")# every group same size...# dfc.groupby("gc").count()# now it's easy to get each of the cuts.... 0 through 5# dfcut0 = dfc.query("gc==0").drop(columns="gc").copy().reset_index(drop=True)# dfcut0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python