Пример каждой группы после групповой панды
Я знаю, что на это, должно быть, кто-то ответил, но я просто не мог найти его.
Проблема: выберите каждую группу после операции 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