每组中子组人口比例相等的分层抽样

问题描述 投票:0回答:1

我有一个带有组列和子组列的数据框。对于每个组,我希望它们在子组中具有相等的比例。关于如何在熊猫中实现这一目标的任何想法?

将熊猫作为pd导入将numpy导入为np

df2 = pd.DataFrame({'group':(['group1','group2']*50),
    'sub_group':['A', 'C', 'D', 'B','B','B','D','D','D','A']*10,
             'days':np.random.normal(15,3,100),
             'cost':np.random.normal(500,75,100)})


g1 = df2[df2['group']=='group1']['sub_group'].value_counts()
g1/g1.sum()
output:
D 0.6
B 0.2
A 0.2
g2 = df2[df2['group']=='group2']['sub_group'].value_counts()
g2/g2.sum()
output:
B 0.4
D 0.2
C 0.2
A 0.2

因此,从g1和g2看,它们具有4个子组的不同种群(注意C甚至不在g1中出现)。我希望有一个可扩展的函数,它可以使这两个组(g1,g2)具有与这些子组(A,B,C,D)相同的人口比例,在这种情况下,C = 0.0。

因此,我希望在此示例中获得的输出是一个数据框,其中两个组的子组比例相等,也许类似于以下内容:

g1 = df2[df2['group']=='group1']['sub_group'].value_counts()
g1/g1.sum()
output:
D 0.4
B 0.3
A 0.3
g2 = df2[df2['group']=='group1']['sub_group'].value_counts()
g2/g2.sum()
output:
B 0.4
D 0.3
A 0.3

编辑:我不是要创建数据集,我只是创建了上面的数据框以进行演示。我正在尝试将其应用于预先存在的数据,并对其进行随机下采样,以使每个数据组中子组的比例相等。

python pandas numpy dataframe sampling
1个回答
0
投票

IIUC,您可以尝试这样的事情:

创建数据:

df2 = pd.DataFrame({'days':np.random.normal(15,3,100), 
                    'cost':np.random.normal(500,75,100)}, 
                   index=pd.MultiIndex.from_product([['group1','group2'],
                                                     ['A','C','D','B','B','B','D','D','D','A']*5]))

df2 = df2.rename_axis(['group','sub_group']).reset_index()

检查:

g1 = df2[df2['group']=='group1']['sub_group'].value_counts()
g1/g1.sum()

D    0.4
B    0.3
A    0.2
C    0.1
Name: sub_group, dtype: float64

g2 = df2[df2['group']=='group2']['sub_group'].value_counts()
g2/g2.sum()

D    0.4
B    0.3
A    0.2
C    0.1
Name: sub_group, dtype: float64
© www.soinside.com 2019 - 2024. All rights reserved.