当前位置: 首页 > 知识库问答 >
问题:

如何有效地标记大数据帧的每组中的随机行?

隗新霁
2023-03-14

我有一个包含40百万行的数据框df。有一个名为group_id的列指定一行的组标识符。一共有2000个群。

我想随机标记每组中的元素,并将此信息添加到dfbatch列中。例如,如果组1包含行1、2、3、4和5,那么我选择(1、2、3、4、5)的排列,例如,我们取(5、3、4、2、1)。然后我将值[5,3,4,2,1]分配给这些行的列batch

我定义了一个函数func,并使用了并行化dummy.Pool,但是速度非常慢。你能建议一个更快的方法吗?

import pandas as pd
import numpy as np
import random
import os
from multiprocessing import dummy
import itertools
core = os.cpu_count()
P = dummy.Pool(processes = core)

N = int(4e7)
M = int(2e3) + 1
col_1 = np.random.randint(1, M, N)
col_2 = np.random.uniform(low = 1, high = 5, size = N)
df = pd.DataFrame({'group_id': col_1, 'value': col_2})
df.sort_values(by = 'group_id', inplace = True)
df.reset_index(inplace = True, drop = True)

id_ = np.unique(df.group_id)

def func(i):
    idx = df.group_id == i
    m = sum(idx) # count the number of rows in each group
    r = list(range(1, m + 1, 1)) # create an enumeration
    random.shuffle(r) # create a permutation the enumeration
    return(r)
    
order_list = P.map(func, id_)
# merge the list containing permutations
order =  list(itertools.chain.from_iterable(order_list)) 

df['batch'] = order

共有1个答案

薄鸿远
2023-03-14

也许这能解决你的问题。对组大小进行随机排列。

import numpy as np
import pandas as pd
l = np.repeat([x for x in range(2000)],20000)
df = pd.DataFrame(l, columns=['group'])

df['batch'] = df.groupby('group')['group'].transform(lambda x: np.random.permutation(np.arange(x.size)))
 类似资料:
  • 问题内容: 我有一种方法,它使用随机样本来近似计算。这种方法被称为数百万次,因此非常重要的是选择随机数的过程必须高效。 我不确定java到底有多快,但是我的程序似乎并没有像我期望的那样受益。 选择随机数时,我将执行以下操作(半伪代码): 现在,这显然具有最坏的最坏情况下的运行时间,因为理论上随机函数可以为永恒添加重复的数字,从而永远停留在while循环中。但是,数字是从{0..45}中选择的,因此

  • 目标是为每个组在数据帧中采样(不替换)不同数量的行。特定组要采样的行数在另一个数据帧中。 示例:idDF是要从中采样的数据帧。这些组由ID列表示。数据框planDF指定每个组要采样的行数,其中“datesToUse”表示行数,“ID”表示组。“totalDates”是该组的总行数,可能有用,也可能无用。 最终结果应包括从第一组(ID 1)中取样的3行、从第二组(ID 2)中取样的2行和从第三组(I

  • 问题内容: 我知道这个问题有很多种,但是我还没有找到与我的效率问题相关的答案。 我有下面的代码工作正常。 我有一个10个项目的数组,可以从中随机选择一个项目(按Enter键)。该代码保留了不能随机选择的5个最近选择的数组(以避免随着时间的推移而重复过多)。 如果chooseName()函数最初选择了最近5次使用的名称,它只会中断并再次调用自身,重复直到找到“唯一”名称。 我有两个问题: 说这是“递

  • 我试图通过保持行之间的一致性来随机化我的行,但会混淆行的顺序,从而随机化从属变量。我有以下数据帧: 并将行随机化: 然后执行重置索引,如 期望输出:

  • 预期产出 每列计数为nan/null的数据帧 注意:我在堆栈溢出中发现的前面的问题只检查null 我知道我可以在Spark中使用函数来查找Spark列中的空值数,但如何在Spark数据帧中查找Nan值?

  • 问题内容: 我有一个大的数据框(几百万行)。 我希望能够对它进行分组操作,而只是按行的任意连续(最好大小相等)的子集进行分组,而不是使用各个行的任何特定属性来确定它们要进入的组。 用例:我想通过IPython中的并行映射将函数应用于每一行。哪行进入哪个后端引擎都没有关系,因为该函数一次基于一行来计算结果。(至少在概念上;实际上是矢量化的。) 我想出了这样的东西: 但这似乎很漫长,并且不能保证大小相