在使用pandas的groupby函数进行分组后,对每个组进行抽样。

72
如何在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%。

3
从 Pandas 1.1 开始,您可以使用 df.groupby('b').sample() 进行操作。相关文档 - cs95
如果您想要对每个组采样不同数量的样本,请参考以下链接:https://stackoverflow.com/a/59437554/8502312 - undefined
2个回答

82

应用 lambda 并调用具有参数 fracsample

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

53

pandas >= 1.1: GroupBy.sample

这就像魔术一样:

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

   a  b
5  6  0
0  1  1

pandas <= 1.0.X

您可以使用GroupBy.applysample。您不需要使用lambda表达式;apply接受关键字参数:

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

   a  b
5  6  0
0  1  1

df.sample(frac=1).groupby('b').head(2) 这个不同。sample 是均匀取样,而这个是首先取一个。它们的使用取决于任务,但 head 取决于排序顺序,而 sample 则不会。 - melgor89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接