根据count列对大熊猫数据帧进行下采样

时间:2018-07-11 00:42:16

标签: 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中的值(或“值和计数”以外的任何其他列)应保持相同。

例如,如果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 个答案:

答案 0 :(得分:1)

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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="drum-machine">
    <div id="display">
        <p id="track"></p>
    </div>
    <div id="QQ" class="drum-pad">
        <audio src="https://s3.amazonaws.com/freecodecamp/drums/Heater-1.mp3" class="clip" id="Q"></audio>
        Q
    </div>
</div>

以OP为例:

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

返回:

downsample(data, 50)