python - 基于计数列对熊猫数据框进行下采样
问题描述
我有成千上万的数据框,如下所示,尽管更大(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
推荐阅读
- sas - SAS工作室 - 格式化
- mysql - 错误“where 子句中的未知列” - 出了什么问题?
- ios - UIPrintInteractionController 打印到多个 AirPrint 打印机
- java - 有没有办法在 driver.manage().timeouts() 方法之外设置隐式超时?
- html-table - 如何创建带有子列组的 html 表?
- python - Python 3:如果一段时间内没有线程放入或取出元素,Queue.empty() 是否正确?
- semantic-ui-react - 使用语义 UI 反应手风琴时如何在部分标题上展开/折叠
- docusignapi - 无法为亲自签名者应用模板角色 [Java]
- zend-studio - 如何在 Zend Studio 11.0 调试表达式详细信息窗格中启用完整变量视图
- javascript - jQuery动态添加计算错误总数的表单字段