我有一个具有以下结构的数据帧:
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