代码之家  ›  专栏  ›  技术社区  ›  Jack Arnestad

基于计数列的降采样熊猫数据帧

  •  4
  • Jack Arnestad  · 技术社区  · 7 年前

    我有数千个数据帧,如下所示,但要大得多(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']})
    

    怎么能做到?

    效率是关键,否则我可以基于计数和随机采样扩展数据帧而不需要替换,然后将其合并到一起。

    谢谢, 杰克

    1 回复  |  直到 7 年前
        1
  •  1
  •   Keshav M    6 年前

    使用多项式抽样,这相对容易。

    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