【发布时间】:2016-09-12 19:49:44
【问题描述】:
假设我有一个这样的数据框
category1 category2 other_col another_col ....
a 1
a 2
a 2
a 3
a 3
a 1
b 10
b 10
b 10
b 11
b 11
b 11
我想从我的数据框中获取一个样本,以便category1 的次数一致。我假设category1 中每种类型的数量相同。我知道这可以通过使用pandas.sample() 的熊猫来完成。但是,我还想确保我选择的样本也同样具有 category2 的代表。因此,例如,如果我的样本量为 5,我会想要这样的东西:
a 1
a 2
b 10
b 11
b 10
我会不想要这样的东西:
a 1
a 1
b 10
b 10
b 10
虽然这是n=4 的有效随机样本,但它不符合我的要求,因为我想尽可能多地改变category2 的类型。
请注意,在第一个示例中,因为 a 仅采样了两次,所以 3 没有从 category2 中表示。这没关系。目标是尽可能统一地表示样本数据。
如果它有助于提供一个更清晰的示例,可以使用类别 fruit、vegetables、meat、grains、junk。在 10 个样本大小中,我希望尽可能多地代表每个类别。所以理想情况下,每个 2 个。然后,属于所选类别的这 2 个所选行中的每一行都将具有子类别,这些子类别也尽可能统一地表示。因此,例如,水果可能有 red_fruits、yellow_fruits 等子类别。对于从 10 个水果类别中选择的 2 个水果类别,red_fruits 和 yellow_fruits 都将在样本中表示。当然,如果我们有更大的样本量,我们会包括更多的水果子类别(green_fruits、blue_fruits 等)。
【问题讨论】:
-
df.drop_duplicates(subset=['category1','category2']).sample(n=4)呢? -
@MaxU IIUC,这会产生偏差,其中与特定对值匹配的第一行是选择的行。我不确定这是 OP 想要的。
-
嗯...这是一个有趣的问题...
-
@MaxU 我在想可以在
df.reindex(np.random.permutation(df.index)).drop_duplicates(subset=['Category1','Category2']).sample(n=4)的出色评论的基础上进行构建,但即使这样也是一个问题 - 如果样本量如此之大,比如说,需要从一些样本中提取 2 个样本怎么办?一对?drop_duplicates使这成为不可能。
标签: python pandas dataframe uniform