预定义了每小时采样的记录数的样本数据框

时间:2019-10-29 00:57:09

标签: python-3.x pandas numpy random

我必须对一个数据帧(df1)进行采样,而我还有另一个数据帧(df2),该数据帧告诉我一天中的每个小时应该检索多少条记录。

例如, df1:

   Hour number
0.  00    A
1.  00    B
2.  00    C
3.  01    D
4.  01    A
5.  01    B
6.  01    D

df2:

   Hour number
0.  00    1
1.  01    2

最后,我将得到例如午夜记录数字1和凌晨1点记录数字3和5(或任何其他组合,只要尊重df2中的数字)

问题是我需要在一个函数中编写此代码,以便我可以在另一个函数中调用它。

到目前为止,我有

def sampling(frame):
     return np.random.choice(frame.index)

但是我无法添加df2的约束。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

首先,我们使用merge将所需的样本数添加为新列,并将sample应用于每组Hour值。最后,我们通过返回除最后一列之外的所有列来删除添加的列:

def sampling(df1, df2):
    return df1.merge(df2, on='Hour').groupby('Hour').apply(lambda x: x.sample(x.Number[0])).reset_index(0,True).iloc[:,:-1]

df1 = pd.DataFrame({'Hour': [0,0,0,1,1,1,1], 'Value': list('ABCDABD')})
df2 = pd.DataFrame({'Hour': [0,1], 'Number': [1,2]})
sampling(df1, df2)

结果:

   Hour Value
2     0     C
4     1     A
5     1     B