如何对 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])
想象一个 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])