【问题标题】:Sample each group after pandas groupby在 pandas groupby 之后对每个组进行采样
【发布时间】:2016-07-23 06:31:18
【问题描述】:

我知道这个问题一定在某个地方得到了回答,但我就是找不到。

问题: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

【问题讨论】:

  • 从 pandas 1.1 开始,您可以使用 df.groupby('b').sample()Relevant docs

标签: python pandas random group-by pandas-groupby


【解决方案1】:

应用 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

【讨论】:

    【解决方案2】:

    熊猫 >= 1.1:GroupBy.sample

    这就像魔术一样:

    # np.random.seed(0)
    df.groupby('b').sample(frac=.3) 
    
       a  b
    5  6  0
    0  1  1
    

    熊猫

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

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

    【讨论】:

    • df.sample(frac=1).groupby('b').head(2) 这个不一样。 Sample 均匀取样,这个第一个第一个。它们的使用取决于任务,但头部取决于排序顺序,而样本则没有。
    猜你喜欢
    • 2015-12-27
    • 1970-01-01
    • 2016-12-23
    • 2021-03-30
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    相关资源
    最近更新 更多