在 pandas groupby 之后对每个组进行采样
Sample each group after pandas groupby
我知道这一定在某些地方得到了回答,但我就是找不到。
问题: 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
应用 lambda 并使用参数 frac
:
调用 sample
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
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.apply
with sample
。您不需要使用 lambda; apply
接受关键字参数:
df.groupby('b', group_keys=False).apply(pd.DataFrame.sample, frac=.3)
a b
5 6 0
0 1 1
我知道这一定在某些地方得到了回答,但我就是找不到。
问题: 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
应用 lambda 并使用参数 frac
:
sample
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
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.apply
with sample
。您不需要使用 lambda; apply
接受关键字参数:
df.groupby('b', group_keys=False).apply(pd.DataFrame.sample, frac=.3)
a b
5 6 0
0 1 1