python – 基于计数列的下采样pandas数据框

我有如下数千个数据框,虽然更大(1000000行,100列).

data = pd.DataFrame({'cols1':[4, 5, 5, 4, 321, 32, 5],
                     'count':[45, 66, 6, 6, 1, 432, 3],
                     'Value':['Apple', 'Boy', 'Car', 'Corn', 'Anne', 'Barnes', 'Bayesian']})

我想从这个数据帧中随机抽样并创建一个新的数据帧,使得计数总和应该只等于N.意思是我想根据计数值随机抽样作为权重,并用这个新的数据框建立一个新的数据框重采样数据,使得计数总和为N.

相对比例应保持大致相同,重新采样时的值不应超过原始计数值的计数. cols1(或除Value和count之外的任何其他列)中的值应保持不变.

例如,如果N为50,则可能如下所示:

pd.DataFrame({'cols1':[4, 5, 5, 4, 321, 32, 5],
                     'count':[4, 7, 1, 1, 0, 37, 0],
                     'Value':['Apple', 'Boy', 'Car', 'Corn', 'Anne', 'Barnes', 'Bayesian']})

如何才能做到这一点?

效率是关键,否则我可以根据计数扩展数据框并随机抽样而无需替换,然后将其合并在一起.

谢谢,
插口

最佳答案 使用多项式采样,这相对容易.

import numpy as np
from itertools import chain

def downsample(df, N):
    prob = df['count']/sum(df['count'])
    df['count'] = list(chain.from_iterable(np.random.multinomial(n = N, pvals = prob, size = 1)))
    df = df[df['count'] != 0]
    return df

对于OP的例子:

downsample(data, 50)

收益:

    Value  cols1  count
1     Boy      5      1
3    Corn      4     16
5  Barnes     32     33
点赞