Pandas多维度分组随机抽样:每组抽取指定数量样本实现方案
按多分组随机抽取指定数量数据行的实现方案
看来你已经找对了方向,用groupby来处理分组抽样完全可行!我来帮你把这个方案补全,完美适配你的需求——按type、Class、image name每个分组随机抽取2条数据。
首先先确认下你的示例数据结构:
import numpy as np import pandas as pd # Setup fake data. np.random.seed([3, 1415]) df = pd.DataFrame({ 'Class': list('AAAAAAAAAABBBBBBBBBB'), 'type': (['short']*5 + ['long']*5) *2, 'image name': (['image01']*2 + ['image02']*2)*5, 'Value2': np.random.random(20) })
接下来就是完整的分组抽样代码,直接补全你没写完的部分:
# 按指定字段分组,每个组随机抽取2条数据 df2 = df.groupby(['type', 'Class', 'image name']).apply(lambda x: x.sample(n=2, random_state=3)).reset_index(drop=True)
代码细节解释
groupby(['type', 'Class', 'image name']):按照你需要的三个维度完成分组,确保每个分组都是唯一的type+Class+image name组合.apply(lambda x: x.sample(n=2, random_state=3)):对每个分组执行抽样操作,n=2指定抽取2条数据;加上random_state是为了固定抽样结果,保证每次运行都得到相同的随机样本(如果不需要固定随机性,可以去掉这个参数).reset_index(drop=True):重置结果的索引,避免分组带来的多级索引干扰后续的数据处理
如果你的数据里存在某些分组的条目不足2条的情况,怕触发报错的话,可以改成下面的写法,自动抽取该分组的所有数据:
df2 = df.groupby(['type', 'Class', 'image name']).apply(lambda x: x.sample(n=min(2, len(x)), random_state=3)).reset_index(drop=True)
这样不管分组里有1条还是更多数据,都能安全完成抽样啦。
内容的提问来源于stack exchange,提问作者Julien
相关产品推荐
相关产品推荐

