Пример каждой группы после групповой панды

Я знаю, что на это, должно быть, кто-то ответил, но я просто не мог найти его.

Проблема: выберите каждую группу после операции 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

Ответ 1

Примените лямбда и вызовите 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

Ответ 2

Образец фракции каждой группы

Вы можете использовать GroupBy.apply с sample. Вам не нужно использовать лямбду; 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