gpt4 book ai didi

python - 基于计数列对 Pandas 数据框进行下采样

转载 作者:太空宇宙 更新时间:2023-11-03 11:40:05 26 4
gpt4 key购买 nike

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

如何做到这一点?

效率是关键,否则我可以根据计数扩展数据框并在不放回的情况下随机抽样,然后将其合并回一起。

谢谢, jack

最佳答案

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

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

关于python - 基于计数列对 Pandas 数据框进行下采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51275700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com