Pandas:根据条件(另一列中的值)随机抽取 5 个连续行

问题描述 投票:0回答:1

对于我的数据,我想连续 5 天抽样 5 批次。对于每组 5 天样本,我希望另一列中的值相同。我的数据是一个时间序列。这是一个示例:

以前,当我对非连续的日子感到满意时,我会使用以下代码:

df.groupby("AGENT").sample(n=5, random_state=1, replace = True)

我希望它是随机的,所以我不想只为第一个新代理和随后的 4 行获取索引。

pandas dataframe sampling
1个回答
0
投票

一个选择是使用自定义

groupby.apply

import numpy as np

n = 5
out = (df.groupby('Agent', group_keys=False)
         .apply(lambda g: g.iloc[(x:=np.random.randint(0, len(g)-n)): x+n])
      )

如果你有 python < 3.8:

import numpy as np

def random_consecutives(g, n):
    start = np.random.randint(0, len(g)-n)
    return g.iloc[start: start+n]

out = (df.groupby('Agent', group_keys=False)
         .apply(random_consecutives, n=5)
      )

示例输出:

    Agent  Sales (k)        Date
2       1        1.2  21/08/2012
3       1        6.7  22/08/2012
4       1        5.8  23/08/2012
5       1        9.3  24/08/2012
6       1        8.3  25/08/2012
12      2        8.0  06/07/2012
13      2        0.9  07/07/2012
14      2        1.3  08/07/2012
15      2        1.6  09/07/2012
16      2        8.9  10/07/2012
© www.soinside.com 2019 - 2024. All rights reserved.