Tengo el siguiente marco de datos de pandas df
column1 column2 list_numbers sublist_column xy [10,-6,1,-4] ab [1,3,7,-2] pq [6,2,-3,-3.2]sublist_column contendrá los números de la columna "list_numbers" que suman 0 (0.5 es una tolerancia) que he escrito siguiendo el código.
def return_list(original_lst,target_sum,tolerance): memo=dict() sublist=[] for i, x in enumerate(original_lst): if memo_func(original_lst, i + 1, target_sum - x, memo,tolerance) > 0: sublist.append(x) target_sum -= x return sublist def memo_func(original_lst, i, target_sum, memo,tolerance): if i >= len(original_lst): if target_sum <=tolerance and target_sum>=-tolerance: return 1 else: return 0 if (i, target_sum) not in memo: c = memo_func(original_lst, i + 1, target_sum, memo,tolerance) c += memo_func(original_lst, i + 1, target_sum - original_lst[i], memo,tolerance) memo[(i, target_sum)] = c return memo[(i, target_sum)]Luego estoy usando la función "return_list" en "sublist_column" para completar el resultado.
target_sum = 0 tolerance=0.5 df['sublist_column']=df['list_numbers'].apply(lambda x: return_list(x,0,tolerance))el siguiente será el marco de datos resultante
column1 column2 list_numbers sublist_column xy [10,-6,1,-4] [10,-6,-4] ab [1,3,7,-2] [] pq [6,2,-3,-3.2] [6,-3,-3.2] #sum is -0.2(within the tolerance)Esto me está dando el resultado correcto pero es muy lento (tarda 2 horas en ejecutarse si uso el IDE de spyder), ya que el tamaño de mi marco de datos tiene aproximadamente 50,000 filas, y la longitud de algunas de las listas en la columna "list_numbers" es más de 15 El tiempo de ejecución se ve particularmente afectado cuando el número de elementos en las listas de la columna "list_numbers" es superior a 15. Por ejemplo, la siguiente lista tarda casi 15 minutos en procesarse.
[-1572.35,-76.16,-261.1,-7732.0,-1634.0,-52082.42,-3974.15, -801.65,-30192.79,-671.98,-73.06,-47.72,57.96,-511.18,-391.87,-4145.0,-1008.61, -17.53,-17.53,-1471.08,-119.26,-2269.7,-2709,-182939.59,-19.48,-516,-6875.75,-138770.16,-71.11,-295.84,-348.09,-3460.71,-704.01,-678,-632.15,-21478.76]¿Cómo puedo mejorar significativamente mi tiempo de ejecución?