gpt4 book ai didi

python Pandas : conditionally select a uniform sample from a dataframe

转载 作者:太空狗 更新时间:2023-10-29 21:09:31 27 4
gpt4 key购买 nike

假设我有一个这样的数据框

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() 的 pandas 来完成。但是,我还想确保我选择的示例也具有同样的 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。这没关系。目标是尽可能统一地表示样本数据。

如果有助于提供更清晰的示例,可以使用类别fruitvegetablesmeatgrains垃圾。在 10 的样本量中,我希望尽可能多地代表每个类别。所以理想情况下,每个 2 个。然后,属于所选类别的这 2 个所选行中的每一行都将具有子类别,这些子类别也尽可能统一地表示。因此,例如,水果可以有 red_fruits、yellow_fruits 等子类别。对于从 10 个水果类别中选择的 2 个水果类别,red_fruits 和 yellow_fruits 都将出现在样本中。当然,如果我们有更大的样本量,我们会包括更多的水果子类别(green_fruits、blue_fruits 等)。

最佳答案

Trick 正在构建平衡阵列。我提供了一种笨拙的方法。然后通过引用平衡数组循环groupby对象采样。

def rep_sample(df, col, n, *args, **kwargs):
nu = df[col].nunique()
m = len(df)
mpb = n // nu
mku = n - mpb * nu
fills = np.zeros(nu)
fills[:mku] = 1

sample_sizes = (np.ones(nu) * mpb + fills).astype(int)

gb = df.groupby(col)

sample = lambda sub_df, i: sub_df.sample(sample_sizes[i], *args, **kwargs)

subs = [sample(sub_df, i) for i, (_, sub_df) in enumerate(gb)]

return pd.concat(subs)

演示

rep_sample(df, 'category1', 5)

enter image description here

关于 python Pandas : conditionally select a uniform sample from a dataframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39457762/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com