对 pandas groupby 之后的每组进行采样

问题描述 投票:0回答:2

groupby操作后如何对每组进行采样?

import pandas as pd

df = pd.DataFrame({'a': [1,2,3,4,5,6,7],
                   'b': [1,1,1,0,0,0,0]})

grouped = df.groupby('b')

鉴于上述设置,我想从每组中进行采样,例如,我想要每组的 30%。

python pandas random group-by
2个回答
82
投票

应用 lambda 并使用参数 sample

:
调用
frac

In [2]:
df = pd.DataFrame({'a': [1,2,3,4,5,6,7],
                   'b': [1,1,1,0,0,0,0]})
​
grouped = df.groupby('b')
grouped.apply(lambda x: x.sample(frac=0.3))

Out[2]:
     a  b
b        
0 6  7  0
1 2  3  1

52
投票

熊猫 >= 1.1:
GroupBy.sample

这就像魔术一样:

# np.random.seed(0)
df.groupby('b').sample(frac=.3) 

   a  b
5  6  0
0  1  1

熊猫<= 1.0.X

您可以将

GroupBy.apply
sample
一起使用。您不需要使用 lambda;
apply
接受关键字参数:

df.groupby('b', group_keys=False).apply(pd.DataFrame.sample, frac=.3)

   a  b
5  6  0
0  1  1
© www.soinside.com 2019 - 2024. All rights reserved.