我想从分组的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)
答案 0 :(得分:0)
使用head
或tail
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)