Skip to main content
 首页 » 编程设计

python Pandas : Get 2 set of random samples per group

2025年05月04日14dudu

我有一个 pandas DataFrame 说:

   user  value 
0     a      1 
1     a      2 
2     a      3 
3     a      4 
4     a      5 
5     b      6 
6     b      7 
7     b      8 
8     b      9 
9     b     10 
10    c     11 
11    c     12 
12    c     13 
13    c     14 
14    c     15 

现在我想按用户分组,并从中创建两个互斥的随机样本,例如

Set1 每组 1 个样本:

   user  value 
3     a      4 
9     b     10 
13    c     14 

Set2 每组 2 个样本:

   user  value 
0     a      1 
1     a      2 
5     b      6 
6     b      7 
10    c     11 
11    c     12 

到目前为止我试过这个:

u = np.array(['a','b','c']) 
u = np.repeat(u,5) 
df = pd.DataFrame({'user':u,'value':[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]}) 
 
set1  = df.groupby(['user']).tail(1) 
set2  = df.groupby(['user']).head(2) 

但这些不是随机样本,我希望它们相互排斥。有什么想法吗?

附言。每个组总是至少有 3 个元素

请您参考如下方法:

您可以为每个用户随机选择3条记录:

a = df.groupby("user")["value"].apply(lambda x: x.sample(3)) 
 
a 
Out[27]:  
user     
a     3      4 
      0      1 
      2      3 
b     5      6 
      7      8 
      6      7 
c     14    15 
      10    11 
      13    14 
dtype: int64 

并将第一个分配给第一组,其余两个分配给第二组:

a.groupby(level=0).head(1) 
Out[28]:  
user     
a     3      4 
b     5      6 
c     14    15 
dtype: int64 
 
a.groupby(level=0).tail(2) 
Out[29]:  
user     
a     0      1 
      2      3 
b     7      8 
      6      7 
c     10    11 
      13    14 
dtype: int64