对数据框进行分组并在组之间以相等概率抽样n行

1 投票
2 回答
42 浏览
提问于 2025-04-14 16:25

我有一个这样的 pandas 数据框:

     ID  Value
0     a     2
1     a     4
2     b     6
3     c     8
4     c    10
5     c    12

我想从 ID 组中进行均匀抽样。我知道可以通过 ID 对数据框进行分组,然后指定想从每个组中抽取的行数,像这样: df.groupby("ID").sample(n=2, replace = True)。但是,我只是希望从每个组抽样的概率相同,并不一定要每个组抽取的行数完全一样。

2 个回答

0

你可以用frac来代替你示例代码中的n。这样可以让你对某个ID使用50%的样本:

newdf=df.groupby("ID").sample(frac=0.5, replace = True)
display(newdf)
1

如果你想从每个组中大致以相同的概率抽取N行数据,你可以先对每个组进行过采样,然后再进行抽样:

import math

N = 4

out = (df.groupby('ID').sample(n=math.ceil(N/df['ID'].nunique()), replace=True)
         .sample(N)
      )

示例输出:

  ID  Value
2  b      6
2  b      6
4  c     10
1  a      4

N = 10时:

  ID  Value
0  a      2
2  b      6
5  c     12
3  c      8
1  a      4
5  c     12
2  b      6
1  a      4
1  a      4
2  b      6

N = 100时的比例:

ID
b    0.34
a    0.33
c    0.33
Name: proportion, dtype: float64

撰写回答