我知道这肯定已经回答了一些地方,但我找不到它。
问题:在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
答案 0 :(得分:33)
应用lambda并使用参数try except
调用sample
:
frac
答案 1 :(得分:2)
您可以将GroupBy.apply
与sample
一起使用。您不需要使用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