按组随机抽样:如何指定 n,而不是权重? (使用 DataFrameGroupBy.sample)

Random sample by group: how to specify n, not weight? (using DataFrameGroupBy.sample)

这个问题在 之后(其他贡献者要求我 post 作为一个新问题)。

我们有这个模拟 df:

df = pd.DataFrame({
        'id': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
        'country': ['USA', 'USA', 'USA', 'USA', 'USA', 'Canada', 'Canada', 'Canada', 'USA', 'Canada']
})

假设我想从美国抽取 4 个随机行,从加拿大抽取 2 个随机行。我试过:

df.groupby("country").sample(n=[4, 2])

这returns一个错误。错误可能是使用了方括号。那么如何给每个组指定不同的n呢?

请注意,理想情况下我需要一个使用 df.groupby.sample 的解决方案。另请注意,我需要指定 n,而不是文档中的比例或权重(请参阅 here)。最后注意我还需要设置一个种子。谢谢

您可以 group country 上的数据帧,然后 .sample each group separately where the number of samples to take can be obtained from the dictionary, finally .concat 所有采样组:

d = {'USA': 4, 'Canada': 2} # mapping dict
pd.concat([g.sample(d[k]) for k, g in df.groupby('country', sort=False)])

   id country
0   1     USA
4   5     USA
1   2     USA
2   3     USA
6   7  Canada
9  10  Canada