Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从DataFrame中的每个组中采样不同数量的行_Python_Python 3.x_Dataframe_Random_Pandas Groupby - Fatal编程技术网

Python 如何从DataFrame中的每个组中采样不同数量的行

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

我有一个带有类别列的数据框。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
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']} )
抽样规则

解决问题
我可以提出两个解决方案:

  • 适用于groupby(一行)

  • 循环组(更详细)


  • 两种方法的性能应该相同。如果性能很重要,您可以将计算矢量化。但精确的优化取决于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)