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

Sto*_*ssa 5 python random dataframe python-3.x 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
cat16    30
cat17    29
cat18    9
cat19    4
cat20    4
cat21    1
cat22    1
cat23    1
Run Code Online (Sandbox Code Playgroud)

我想从每个类别中选择不同数量的行。(而不是每个类别的 n 个固定行数)

Example input:
size_1 : {"cat1": 40, "cat2": 20, "cat3": 15, "cat4": 11, ...}
Example input: 
size_2 : {"cat1": 51, "cat2": 42, "cat3": 18, "cat4": 21, ...}
Run Code Online (Sandbox Code Playgroud)

我想要做的实际上是一个分层抽样,给定数量的实例对应于每个类别。

此外,它应该是随机选择的。例如,我不需要 size_1.["cat1"] 的前 40 个值,我需要随机的 40 个值。

谢谢您的帮助。

Sta*_*luk 6

人工数据生成


数据框

我们先生成一些数据,看看如何解决问题:

# 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']} )
Run Code Online (Sandbox Code Playgroud)

抽样规则

# Number of rows, that we want to be sampled from each category 
samples_per_group_dict = {'Jai': 1, 
                          'Princi':2}
Run Code Online (Sandbox Code Playgroud)

解决问题


我可以提出两种解决方案:

  1. 在 groupby 上申请(单行)

    output = df.groupby('Category').apply(lambda group: group.sample(samples_per_group_dict[group.name])).reset_index(drop = True)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 循环组(更详细)

    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)
    
    Run Code Online (Sandbox Code Playgroud)

两种方法的性能应该相同。如果性能很重要,您可以矢量化您的计算。但精确的优化取决于每组中的 n_groups 和 n_samples。