在groupby之后在python中的每个组上采样

时间:2018-12-12 13:46:58

标签: python pandas numpy

我有一个如下数据框:

index   accountid  transdate

0        116490  2018-10-01
1        116490  2018-07-01
2        116490  2018-09-01
3        116490  2018-08-01
4        123033  2018-10-01
5        123033  2018-07-01
6        123033  2018-09-01
7        123033  2018-08-01
8        114175  2018-10-01
9        114175  2018-07-01
10       114175  2018-09-01
11       114175  2018-08-01
12       112962  2018-10-01
13       112962  2018-07-01
14       112962  2018-09-01
15       112962  2018-08-01

我正在尝试从accountid的每组中随机获取行数。 例如,这里每个帐户id有4个transdates,我试图在accountid上进行分组,并从每个组中获取最少1行,最多4行。

预期输出:

index    accountid  transdate

0        116490 2018-10-01
1        116490 2018-07-01
3        116490 2018-08-01
4        123033 2018-10-01
5        123033 2018-07-01
8        114175 2018-10-01
9        114175 2018-07-01
10       114175 2018-09-01
11       114175 2018-08-01
12       112962 2018-10-01
13       112962 2018-07-01
15       112962 2018-08-01

我一直按accountid进行分组,并在已分组的对象上应用random.sample,但是每次它从每个组中返回固定数量的行时。

1 个答案:

答案 0 :(得分:3)

您可以使用pandas.Series.sample获取每个类别的随机样本,还可以在1 ... min(4, len(category))中设置要随机分布的元素数:

import random

def random_sample(x):
    n = random.randint(1, min(4, len(x)))
    return x.sample(n)

df.groupby("accountid").transdate.apply(random_sample)
# accountid    
# 112962     13    2018-07-01
#            14    2018-09-01
#            15    2018-08-01
# 114175     10    2018-09-01
#            11    2018-08-01
# 116490     2     2018-09-01
#            0     2018-10-01
#            3     2018-08-01
# 123033     5     2018-07-01
#            4     2018-10-01
#            7     2018-08-01