首页 > 解决方案 > 如何从单个熊猫数据框列的值中选择大小为 n 的随机样本,重复值最多出现 2 次?

问题描述

我的数据框如下所示:

Identifier       Strain     Other columns, etc.
1                  A
2                  C
3                  D
4                  B
5                  A
6                  C
7                  C
8                  B
9                  D
10                 A
11                 D
12                 D

我想随机选择 n 行,同时保持应变值的多样性。例如,我想要一组 6 人,所以我希望我的最后几行至少包括每种菌株中的一种,其中两种菌株出现两次。

我尝试将 Strain 列转换为 numpy 数组并使用方法 random.choice 但似乎没有运行。我也尝试过使用 .sample 但它不能最大限度地提高应变多样性。

这是我最新的尝试,它按顺序输出大小为 7 的样本(标识符 0-7),并且菌株都是相同的。

randomsample = df[df.Strain == np.random.choice(df['Strain'].unique())].reset_index(drop=True)

标签: pythonpandasdataframenumpyrandom

解决方案


我相信 numpy 中有一些东西可以做到这一点,但不记得是哪个。这是一个相当快的方法:

  1. 随机打乱数据
  2. 枚举每组中的行
  3. 按上面的枚举排序
  4. 切片顶n

所以在代码中:

n = 6

df = df.sample(frac=1)                      # step 1 
enums = df.groupby('Strain').cumcount()     # step 2 
        
orders = np.argsort(enums)                  # step 3
samples = df.iloc[orders[:n]]               # step 4

输出:

   Identifier Strain  Other columns, etc.
2           3      D                  NaN
7           8      B                  NaN
0           1      A                  NaN
5           6      C                  NaN
4           5      A                  NaN
8           9      D                  NaN

推荐阅读