python - 如何从单个熊猫数据框列的值中选择大小为 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)
解决方案
我相信 numpy 中有一些东西可以做到这一点,但不记得是哪个。这是一个相当快的方法:
- 随机打乱数据
- 枚举每组中的行
- 按上面的枚举排序
- 切片顶
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
推荐阅读
- python - 如何使用测试套件构建和部署 python 项目
- nginx - nginx位置匹配多次
- excel - 计算直到一个月的第 n 天的天数
- spring - 在休眠验证中根据语言环境定义消息
- shell - Shell 脚本 - 知道包含的路径,然后包含另一个文件
- react-native - 如何知道 FlatList 中滚动(向上或向下)的状态?
- android - 我们如何在没有互联网连接(离线)的情况下使用 android developer basics V2(概念和代码实验室)?
- node.js - MongoSkin“无法读取未定义的属性‘应用’”
- bash - “别名:=:未找到”,并且未定义别名,在 .bashrc 中使用“别名 ll = 'ls -l'”
- node.js - 将电子应用程序最小化到系统托盘后,窗口调整大小不起作用