如何对 pandas 数据框进行采样,从第 1 组中选择 X 行,但从第 2 组中选择 Y 行

How to sample a pandas dataframe selecting X rows from group 1 but Y rows from group2

想象一个 Students/Grades 数据框

使用 pandas,我如何创建多个小组,使每个小组有 1 个 A 学生、2 个 Bs 学生和 1 个 C 学生?

我试过使用 pandas' GroupBy['Grade'] 然后从每个年级组中抽样。这个问题是它给了我每个年级组相同数量的学生,但是,我想要每个特定年级组的特定数量的学生。

解决方案不应该关心 "left overs"。如果我有一个完全符合要求的分布的集合,我会很高兴。

感谢您的帮助,

您可以通过使用字典来存储每组样本的数量来实现这一点,如下所示:

import pandas as pd
import numpy as np

# create the dataframe
df = pd.DataFrame(zip(['Person'+ str(i+1) for i in range(30)],
                 np.random.choice(['A','B', 'C'], 30, replace=True)),
             columns = ['Student','Grade'])

# use a dict to store the sample frequencies
sample_freq = {'A':1, 'B':2, 'C':3}

# group by desired variable
groups = df.groupby('Grade')

# sample from each group and concatenate them to a single data frame
pd.concat(
    [group_df.sample(sample_freq[group]) for group,group_df in groups])