为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas groupby 采样 - 忽略样本大于元素数量的情况

Pandas groupby 采样 - 忽略样本大于元素数量的情况

蓝山帝景 2023-08-22 14:46:00
我可以a从每个分组中进行采样b,如下所示。df = pd.DataFrame({'a': [10,20,30,40,50,60,70],                   'b': [1,1,1,0,0,0,0]})df.groupby('b', as_index=False)['a'].apply(lambda x: x.sample(n=3))给出:b       a0  3    40   4    50   5    601  0    10   2    30   1    20但是,如果我想对n元素进行采样,则n必须设置为最多一个组中的元素数量(如果我们想要的话replace=False)是否有一种干净的方法来对n组中的元素进行采样,最多可达最大数量的项目?例如,在给定的 DataFrame: in 中b,存在三个值为 的项目1。如果我愿意df.groupby('b').apply(lambda x: x.sample(n=4)),(注意n=4)这就会破裂。对每组进行最大采样的干净方法是什么?
查看完整描述

2 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

将其包裹起来min是一个选项:


df = pd.DataFrame({'a': [10,20,30,40,50,60,70],

                   'b': [1,1,1,0,0,0,0]})


n = 4

df.groupby('b', as_index=False)['a'].apply(lambda x: x.sample(n=min(10, len(x))))

输出:


0  3    40

   4    50

   6    70

   5    60

1  2    30

   1    20

   0    10

Name: a, dtype: int64

或者,如果您总是想对最大值进行采样(即随机洗牌),请使用frac:


df.groupby('b', as_index=False)['a'].apply(lambda x: x.sample(frac=1))

输出:


0  6    70

   4    50

   5    60

   3    40

1  2    30

   1    20

   0    10

Name: a, dtype: int64

请注意pandas-1.1.0,您可以直接sample从 groupby 对象访问。



查看完整回答
反对 回复 2023-08-22
?
SMILET

TA贡献1796条经验 获得超4个赞

您可以通过将预先指定的最大样本大小与组的大小进行比较来自适应地修改样本大小。

max_sample = 4
df.groupby('b')['a'].apply(lambda x: x.sample(n=max_sample if len(x)>max_sample else len(x)))


查看完整回答
反对 回复 2023-08-22
  • 2 回答
  • 0 关注
  • 1531 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信