为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PIPIONE 2023-06-20 13:52:54
我有两个组(A和B)的数据框,在这些组中,有 6 个子组(、、、、、a和)。示例数据如下:bcdefindex   group    subgroup    value0       A        a           11       A        b           12       A        c           13       A        d           14       A        e           15       A        f           16       B        a           17       B        b           18       B        c           19       B        d           110      B        e           111      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 个批次以供更多用户使用。)但我无法判断这是否是数据帧应该随机拆分或采样的问题。有没有人对如何实现这一目标有建议?
查看完整描述

1 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

使用一些技巧

  1. 用于pd.factorize()将分类数据转换为每个类别的值

  2. 计算代表组/子组对的值/因子f

  3. 随机化一点np.random.uniform(),最小值和最大值接近 1

  4. 一旦有一个代表分组的值,就可以sort_values()并且reset_index()有一个干净的有序索引

  5. 最终通过整数余数进行分组

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=6

dfc = 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 SO

dfc.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

//img1.sycdn.imooc.com//64913ed700018f2703970245.jpg

查看完整回答
反对 回复 2023-06-20
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信