分层采样器



我有一个具有以下结构的数据帧:


import pandas as pd

df = pd.DataFrame({
"x": [0, 0, 1, 1, 0, 0, 1, 1],
"y": [1, 2, 1, 2, 2, 2, 1, 1],
})

我想要一个函数来生成一个随机列;A";以及";B";使得对于列的给定子集(比如"x"(,我们具有相同的"x"的外观;A";以及";B";。如果我们选择";x〃;作为地层柱,一个可能的结果是:


import pandas as pd

df = pd.DataFrame({
"x": [0, 0, 1, 1, 0, 0, 1, 1],
"y": [1, 2, 1, 2, 2, 2, 1, 1],
"outcome": ["A", "B", "A", "B", "A", "B", "A", "B"]
})

请记住,我们可能将x和y都作为列的子集(这意味着,对于每对x,y值,我们应该有相同数量的a和B(。当然,如果A和B的组合是偶数,我们可能无法做到这一点,在这种情况下,我们最多应该比B多1个A,反之亦然。

你能帮我吗?谢谢

如果您想要一个精确的比例(在奇偶校验的极限内(,可以使用groupby.sample:

chosen = df.groupby('x').sample(frac=0.5).index
df['outcome'] = np.where(df.index.isin(chosen), 'A', 'B')

示例输出:

x  y outcome
0  0  1       A
1  0  2       A
2  1  1       B
3  1  2       A
4  0  2       B
5  0  2       B
6  1  1       A
7  1  1       B

N范畴的推广

在这里,我们需要改变策略。让我们用sample(frac=1)打乱DataFrame,然后分配一个以N为模的顺序(每组(,最后我们将值映射到类别:

cat = ['A', 'B', 'C']
# for more randomness
# np.random.shuffle(cat)
df['outcome'] = (df.sample(frac=1)
.groupby('x').cumcount().mod(len(cat))
.map(dict(enumerate(cat)))
)

输出:

x  y outcome
0  0  1       C
1  0  2       A
2  1  1       A
3  1  2       A
4  0  2       B
5  0  2       A
6  1  1       C
7  1  1       B

大样本均匀分布检查:

x  outcome
0  A          0.333333
B          0.333333
C          0.333333
1  A          0.333333
B          0.333333
C          0.333333
dtype: float64

最新更新