Python Pandas:如何在分组时采样,N>团体规模?

时间:2017-10-25 15:37:21

标签: python pandas pandas-groupby

我想从分组的Pandas DataFrame中进行采样,其中组大小有时小于N.在下面的示例中,当组大小> = 3时,我怎样才能采样3,否则所有成员组?

我正在尝试以下操作,但是我收到一条错误消息“当'replace = False'时,不能采用比人口更大的样本”。

 import pandas as pd

 df = pd.DataFrame({'some_key':[0,0,0,0,0,0,1,2,1,2],
               'val':      [0,1,2,3,4,5,6,7,8,9]})

 gby = df.groupby(['some_key'])

 gby.apply(lambda x: x.sample(n=3)).reset_index(drop=True)

3 个答案:

答案 0 :(得分:0)

使用headtail

df.groupby(['some_key']).head(3)
Out[248]: 
   some_key  val
0         0    0
1         0    1
2         0    2
6         1    6
7         2    7
8         1    8
9         2    9

编辑

l=[]
for _,df1 in df.groupby('some_key'):

    if (len(df1)<3):
        l.append(df1)
    else:
        l.append(df1.sample(3))

pd.concat(l,axis=0)

Out[401]: 
   some_key  val
1         0    1
3         0    3
4         0    4
6         1    6
8         1    8
7         2    7
9         2    9

答案 1 :(得分:0)

你可以做到

 gby.apply(lambda x: x.sample(n=3) if x.shape[0]>=3 else x).reset_index(drop=True)

你可以在lambda函数中使用条件构造

val_if_true if cond else val_if_false

答案 2 :(得分:0)

回答我自己的问题......

我提出了一个解决方案,与温家宝提出的方案略有不同。

import pandas as pd

def nsample(x,n):
    if len(x) <= n:
        return x
    else:
        return x.sample(n=n)

df = pd.DataFrame({'some_key':[0,0,0,0,0,0,1,2,1,2],
                   'val':      [0,1,2,3,4,5,6,7,8,9]})

gby = df.groupby(['some_key'])

n_max = 3 
gby.apply(lambda x: nsample(x, n_max)).reset_index(drop=True)

# Alternative with inline lambda
gby.apply(lambda x: x.sample(n= n_max) if len(x)> n_max else x).reset_index(drop=True)