我有成千上万个如下所示的数据帧,尽管更大(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']})
这怎么办?
效率是关键,否则我可以根据计数扩展数据框架并随机抽样而不进行替换,然后将其合并回去。
谢谢, 杰克
答案 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)