Python 如何从DataFrame中的每个组中采样不同数量的行
我有一个带有类别列的数据框。Df对于每个类别有不同的行数Python 如何从DataFrame中的每个组中采样不同数量的行,python,python-3.x,dataframe,random,pandas-groupby,Python,Python 3.x,Dataframe,Random,Pandas Groupby,我有一个带有类别列的数据框。Df对于每个类别有不同的行数 category number_of_rows cat1 19189 cat2 13193 cat3 4500 cat4 1914 cat5 568 cat6 473 cat7 216 cat8 206 cat9 197 cat10 147 cat11 130 cat12 49 cat13 38 cat14 35 cat15 35
category number_of_rows
cat1 19189
cat2 13193
cat3 4500
cat4 1914
cat5 568
cat6 473
cat7 216
cat8 206
cat9 197
cat10 147
cat11 130
cat12 49
cat13 38
cat14 35
cat15 35
cat16 30
cat17 29
cat18 9
cat19 4
cat20 4
cat21 1
cat22 1
cat23 1
我想从每个类别中选择不同数量的行。
(而不是每个类别中n个固定数量的行)
我想做的实际上是分层抽样,每个类别对应给定数量的实例
category number_of_rows
cat1 19189
cat2 13193
cat3 4500
cat4 1914
cat5 568
cat6 473
cat7 216
cat8 206
cat9 197
cat10 147
cat11 130
cat12 49
cat13 38
cat14 35
cat15 35
cat16 30
cat17 29
cat18 9
cat19 4
cat20 4
cat21 1
cat22 1
cat23 1
此外,还应随机选择。例如,我不需要大小_1的前40个值。[“cat1”],我需要随机的40个值
感谢您的帮助。人工数据生成
数据帧 我们先生成一些数据,看看如何解决这个问题:
# Define a DataFrame containing employee data
df = pd.DataFrame({'Category':['Jai', 'Jai', 'Jai', 'Princi', 'Princi'],
'Age':[27, 24, 22, 32, 15],
'Address':['Delhi', 'Kanpur', 'Allahabad', 'Kannauj', 'Noida'],
'Qualification':['Msc', 'MA', 'MCA', 'Phd', '10th']} )
抽样规则
解决问题
我可以提出两个解决方案:
两种方法的性能应该相同。如果性能很重要,您可以将计算矢量化。但精确的优化取决于n个组和每个组中的n个样本。我编辑了我的答案,这样可以避免创建额外的列。如果你满意的话——如果你能把我的答案记为正确的话,我将不胜感激。如果没有-请-填写免费要求任何改进。谢谢你的编辑,我已经标记了你的答案。这真的很有帮助。我在我的项目中使用过:)谢谢。
# Number of rows, that we want to be sampled from each category
samples_per_group_dict = {'Jai': 1,
'Princi':2}
output = df.groupby('Category').apply(lambda group: group.sample(samples_per_group_dict[group.name])).reset_index(drop = True)
list_of_sampled_groups = []
for name, group in df.groupby('Category'):
n_rows_to_sample = samples_per_group_dict[name]
sampled_group = group.sample(n_rows_to_sample)
list_of_sampled_groups.append(sampled_group)
output = pd.concat(list_of_sampled_groups).reset_index(drop=True)