熊猫:在groupby之后对每组进行抽样

时间:2016-04-03 19:54:51

标签: python pandas

我知道这肯定已经回答了一些地方,但我找不到它。

问题:在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')

# now sample from each group, e.g., I want 30% of each group

2 个答案:

答案 0 :(得分:33)

应用lambda并使用参数try except调用sample

frac

答案 1 :(得分:2)

每个组的一小部分样本

您可以将GroupBy.applysample一起使用。您不需要使用lambda。 apply接受关键字参数:

frac = .3
df.groupby('b').apply(pd.DataFrame.sample, frac=.3)
     a  b
b        
0 6  7  0
1 0  1  1

如果不需要MultiIndex,则可以将group_keys=False设置为groupby

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

   a  b
6  7  0
2  3  1

每个组中的N行示例

apply很慢。如果您的用例是对固定数量的行进行采样,则可以事先对DataFrame进行随机排序,然后使用GroupBy.head

df.sample(frac=1).groupby('b').head(2)

   a  b
2  3  1
5  6  0
1  2  1
4  5  0

这与df.groupby('b', group_keys=False).apply(pd.DataFrame.sample, n=N)相同,但速度更快

%%timeit df.groupby('b', group_keys=False).apply(pd.DataFrame.sample, n=2)  
                                                 # 3.19 ms ± 90.5 µs
%timeit df.sample(frac=1).groupby('b').head(2)   # 1.56 ms ± 103 µs