熊猫:通过自定义概率函数对分组对象进行采样?

时间:2020-10-13 23:01:43

标签: pandas dataframe sample

出于某些复杂的原因,我需要从一个熊猫数据框中采样,在其中我将一个特定的变量call_id分组,然后对给定的变量num_days(从调用开始算起的天数)应用一些逻辑。

通常来说,我想使用类似〜负指数方案的方法,其中天数越高,行被采样的可能性就越低。这是一个说明我的采样方案的函数:

import numpy as np
import matplotlib.pyplot as plt
span = [i for i in range(1,31)]
x = [1/(1+np.log(i)) for i in span]

import random
def sampler(days):
    weights = [selector[day] for day in days]
    coin_flips = [random.uniform(0,1) for i in range(len(days))]
    samples = [days[i] for i in range(len(days)) if weights[i] >= coin_flips[i]]
    return samples

days = [i for i in range(1,31)]
sampler(days)

>>> 
[1, 2, 3, 7, 9, 12, 17, 24, 25, 26]

如该函数所示,最接近0的数字被采样的可能性最高,并且概率衰减是平滑的。

我陷入困境的地方是将此函数合并到groupbysample方法中,我引用了一个半相似的问题Sample each group after pandas groupby

假设一个数据框:

df = pd.DataFrame({'days': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],
                   'class': [1,2,3,1,2,3,1,2,3,1,2,3,1,2,3],
                   'value': [1,1,1,0,1,1,0,1,0,0,0,1,0,0,0]})
​
grouped = df.groupby('class')
grouped.apply(lambda x: x.sample(sampler(days)))

这显然行不通;我对最好的前进方式感到困惑。有什么建议吗?

0 个答案:

没有答案