首页 > 解决方案 > 每个客户提供不同样本大小的样本

问题描述

我有一个这样的数据框

    Customer   Day
0.    A         1
1.    A         1
2.    A         1
3.    A         2
4.    B         3
5.    B         4

我想从中取样,但我想为每个客户取样不同的尺寸。我在另一个数据框中有每个客户的大小。例如,

    Customer   Day
0.    A         2
1.    B         1

假设我想每天对每个客户进行抽样。到目前为止,我有这个功能:

def sampling(frame,a): 
    return np.random.choice(frame.Id,size=a) 

grouped = frame.groupby(['Customer','Day'])
sampled = grouped.apply(sampling, a=??).reset_index()

如果我将 size 参数设置为全局常量,它运行没问题。但是当不同的值在单独的数据帧上时,我不知道如何设置它。

标签: pythonpython-3.xpandassampling

解决方案


您可以使用样本大小从 df1 创建映射器,并将该值用作样本大小,

mapper = df1.set_index('Customer')['Day'].to_dict()

df.groupby('Customer', as_index=False).apply(lambda x: x.sample(n = mapper[x.name]))


       Customer Day
0   3   A       2
    2   A       1
1   4   B       3

这会返回多索引,你可以随时reset_index,

df.groupby('Customer').apply(lambda x: x.sample(n = mapper[x.name])).reset_index(drop = True)

    Customer    Day
0   A           1
1   A           1
2   B           3

推荐阅读