出于某些复杂的原因,我需要从一个熊猫数据框中采样,在其中我将一个特定的变量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的数字被采样的可能性最高,并且概率衰减是平滑的。
我陷入困境的地方是将此函数合并到groupby
和sample
方法中,我引用了一个半相似的问题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)))
这显然行不通;我对最好的前进方式感到困惑。有什么建议吗?