Python - manejo de dataframe iterando muchas filas

 
Vista:

manejo de dataframe iterando muchas filas

Publicado por Centella (3 intervenciones) el 15/07/2020 02:58:02
Hola, necesito ayuda pues creo que mi código es ineficiente y creo que puede haber una manera de hacerlo mejor, el objetivo del código es que toma un listado de excel y tiene que relacionar cada elemento de una columna con el resto de elementos de la misma columna y dependiendo de unas condiciones almacenarlo en un nuevo data frame con la información conjunta, en mi caso el archivo cuenta con mas de 16000 filas, por lo que al realizar el ejercicio debe realizar (16000 x 16000) 256000000 de iteraciones. Pero tarda días procesando, el código que tengo es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import pandas as pd
import numpy as np
 
 
excel1="Cs.xlsx"
 
dataframe1=pd.read_excel(excel1)
 
col_names=["Eb","Eb_n","Eb_Eb","L1","Ll1","L2","Ll2","D"]
my_df =pd.DataFrame(columns=col_names)
 
count_row = dataframe1.shape[0]
 
 
#Se crea el bucle for para hacer la operación repetitiva de concatenar Eb y crear un nuevo DF
 
print(count_row)
 
for n in range(0,count_row):
 
	for p in range(0,count_row):
		if abs(dataframe1.iloc[n,1] - dataframe1.iloc[p,1]) < 0.27 and abs(dataframe1.iloc[n,2] - dataframe1.iloc[p,2]) < 0.27:
			Nb_Nb=dataframe1.iloc[n,0]+"_"+dataframe1.iloc[p,0]
 
 
			myrow=pd.Series([dataframe1.iloc[n,0],dataframe1.iloc[p,0],Nb_Nb,dataframe1.iloc[n,1],
			dataframe1.iloc[n,2],dataframe1.iloc[p,1],dataframe1.iloc[p,2]],
			index=["Eb","Eb_n","Eb_Eb","L1","Ll1","L2","Ll2"])
			my_df = my_df.append(myrow, ignore_index=True)
		#print(Nb_Nb)
print(my_df.head(5))

De antemano muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 403
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

manejo de dataframe iterando muchas filas

Publicado por Daniel (95 intervenciones) el 15/07/2020 09:40:09
Hola,

Los bucles se pueden evitar utilizando las posibilidades de filtrado de Pandas. Por ejemplo, para seleccionar los elementos cuya diferencia es menor que 0.27

1
df[ df.["C1"] – df.["C2"] < 0.27]


Saludos,
Daniel Rodríguez
Analytics Lane
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

manejo de dataframe iterando muchas filas

Publicado por Centella (3 intervenciones) el 16/07/2020 01:21:29
Gracias Daniel,
El problema es que necesito que se relacionen todos los datos de una misma columna, no de dos diferentes, así, por ejemplo si en la columna tengo los datos a, b, c. Las operaciones a realizar deberían ser a-a, a-b, a-c, b-a, b-b, b-c, c-a, c-b , c-c. y me parece que duplicar la columna tampoco lo soluciona.

El problema parece ser mas difícil.

Saludos

Anderson
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 403
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

manejo de dataframe iterando muchas filas

Publicado por Daniel (95 intervenciones) el 16/07/2020 09:34:51
Hola,

Se puede evitar un bucle for y acelerar algo las cosas con algo como:

1
2
3
4
for i in range():
	sub_df = df[ df.["C1"] – df.["C2"][i] < 0.27]
 
	# Ahora opera sobre sub_df es el subconjunto de df que cumple la condición

en sub_db estasn todos las filas que cumplen que la difrerencia entre C1 y la fila i de C2 es menor que 0.27

Saludos,
Daniel Rodríguez
Analytics Lane
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

manejo de dataframe iterando muchas filas

Publicado por Centella (3 intervenciones) el 17/07/2020 01:05:20
Muchas gracias Daniel, fue muy útil, logré disminuir el tiempo de ejecución, efectivamente se eliminó uno de los bucles y ayudó mucho.

Saludos,

Anderson
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar