El 14 de mayo de 2014, 1:50, AGTUGO <[email protected]> escribió: > Sí lo unico que me causa un poco de ruido es usar el ciclo for para crear > los renglones, siempre trato de evitarlos y usar streaming, indexing, > slicing. Pero pues ya cambie mi forma de las combinaciones por tu método. > > Sigo considerando que deberías usar numpy arrays y una vez tengas los datos crear el DataFrame final. Modificar un DataFrame puede ser costoso, computacionalmente hablando, sobretodo insertar cosas línea a línea (aunque usando el método 'loc' remedie en parte eso).
Saludos. > > 2014-05-13 14:49 GMT-05:00 Kiko <[email protected]>: > > >> >> >> El 13 de mayo de 2014, 20:52, AGTUGO <[email protected]> escribió: >> >> Pues aqui tengo el siguiente codigo donde no necesito crear un array >>> intermedio. >>> >>> Creo que la mejor opcion es simplemente usar ix para tener indexing tipo >>> numpy, >>> ¿Que opinas Kiko? >>> >>> import numpy as np >>> import itertools >>> ## tamaño de los renglones y columnas de los datos tabulados >>> >>> rows = 10 >>> columns =5 >>> ## informacion proporcionada en forma tabulada aqui estoy simulando el >>> csv >>> data = np.arange(rows*columns).reshape(rows,columns) >>> data_pa = pd.DataFrame(data, columns = ('A','B','C','D','E')) >>> display(data_pa) >>> >>> ## lo siguiente crea los indices de las combinaciones >>> >>> to_mix = np.arange(rows) >>> mixed = list(itertools.product(to_mix,to_mix)) >>> combination = [x for x in mixed if (x[0]< x[1])] >>> combination = np.array(combination) >>> >>> >>> # separo los indices en dos variables >>> index1_comb = combination[:,0] >>> index2_comb = combination[:,1] >>> >>> #creo dos dataframes con los indices y despues los junto >>> >>> first_c=data_pa.iloc[index1_comb].reset_index(drop=True) >>> second_c=data_pa.iloc[index2_comb].reset_index(drop=True) >>> final_data_pandas = pd.concat((first_c,second_c),axis=1) >>> display(final_data_pandas ) >>> >>> >> En las versiones que te he dejado no uso en ningún momento numpy. ¿No te >> valen como opción? >> >>> >>> >>> >>> >>> 2014-05-13 13:09 GMT-05:00 Kiko <[email protected]>: >>> >>> >>>> >>>> >>>> El 13 de mayo de 2014, 20:05, AGTUGO <[email protected]> escribió: >>>> >>>> >>>>> Muchas gracias, no es para clase. Es un programa para calcular la vida >>>>> minima de un componente mecánico, entonces debo buscar la vida minima >>>>> buscando todas las posibles combinaciones y despues hacer calculos. Esta >>>>> rutina la hago varias veces con algunas variaciones, y con el dataframe es >>>>> mas facil visualizar. >>>>> >>>>> Cuando paso a un array pierdo un poco de informacion de los headers, y >>>>> la tengo que extraer y volver a meter. En mi opinion estar cambiando de >>>>> tipos de datos aumenta la probabilidad de errores y la lectura posterior. >>>>> Es más o menos el ya discutido problema de evitar el tipo matrix en numpy >>>>> y >>>>> solamente usar arrays aunque sea no tan transparente las operaciones >>>>> matriciales. >>>>> >>>>> >>>>> >>>> Pues si te ha funcionado, perfecto, y si no es lo que buscabas seguimos >>>> iterando. >>>> >>>> Saludos. >>>> >>>> >>>>> 2014-05-13 12:16 GMT-05:00 Kiko <[email protected]>: >>>>> >>>>> >>>>>> >>>>>> >>>>>> El 13 de mayo de 2014, 18:31, AGTUGO <[email protected]> escribió: >>>>>> >>>>>> Entiendo el punto pero tengo que pasar por un array intermedio. La >>>>>>> idea es agarrar un archivo csv direcatamente a un dataframe y de ahi >>>>>>> sacar >>>>>>> el dataframe con las combinaciones, el método actual sería: >>>>>>> >>>>>>> 1.- Importar csv en dataframe >>>>>>> 2.- Crear un array del dataframe >>>>>>> 3.- Crear los indices de las combinaciones >>>>>>> 4.- Usar la notacion de indices para crear el array >>>>>>> 5.- Crear el dataset a partir del array >>>>>>> >>>>>>> Método buscado: >>>>>>> >>>>>>> 1.- Importar csv en dataframe >>>>>>> 2.- Crear indices de las combinaciones >>>>>>> 3.- Usar "algo" usando los indices para crear el dataframe nuevo a >>>>>>> partir del dataframe viejo >>>>>>> >>>>>>> >>>>>>> import pandas as pd >>>>>> from itertools import combinations >>>>>> >>>>>> #Suponemos que este dataframe viene de leerlo con un pd.read_csv() >>>>>> #Lo dejo así por simplificar >>>>>> df0 = pd.DataFrame([list(range(i,i+5)) for i in range(0,50,5)], >>>>>> columns = range(5)) >>>>>> >>>>>> #creamos el dataframe de destino con 10 columnas >>>>>> df1 = pd.DataFrame(columns = range(10)) >>>>>> >>>>>> # De esta forma estás usando los índices del dataframe df0 para hacer >>>>>> las combinaciones >>>>>> for i,j in enumerate(combinations(df0.index,2)): >>>>>> df1.loc[i] = np.append(df0.ix[j[0]], df0.ix[j[1]]) >>>>>> >>>>>> El dataframe df1 tendría todas las combinaciones. Me sigue pareciendo >>>>>> complicado e innecesario lo que quieres hacer (a no ser que sea un >>>>>> ejercicio para clase y entonces podría entender lo rebuscado del asunto). >>>>>> >>>>>> Saludos. >>>>>> >>>>>> >>>>>>> >>>>>>> 2014-05-13 2:12 GMT-05:00 Kiko <[email protected]>: >>>>>>> >>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> El 13 de mayo de 2014, 7:23, AGTUGO <[email protected]> escribió: >>>>>>>> >>>>>>>> Hola, >>>>>>>>> >>>>>>>>> He estado tratando de hacer implementacion solamente con panda de >>>>>>>>> lo siguiente que ya tengo con numpy, pero no me ha salido nada bien. >>>>>>>>> Para >>>>>>>>> los mas entradillos con pandas espero que lo siguiente sea trivial. >>>>>>>>> >>>>>>>>> La entrada son datos tabulados de dos dimensiones o una matrix, la >>>>>>>>> idea es formar todas las combinaciones, sin repetir y sin >>>>>>>>> sustitución, de >>>>>>>>> los renglones. La pareja de renglones se ponen en un solo renglon. >>>>>>>>> >>>>>>>>> Mi algoritmo actual es crear los indices de las combinaciones >>>>>>>>> posibles, y despues crear la mezcla usando los indices. En codigo >>>>>>>>> sería lo >>>>>>>>> siguiente. >>>>>>>>> >>>>>>>>> #### combinaciones.py >>>>>>>>> >>>>>>>>> >>>>>>>>> import numpy as np >>>>>>>>> import itertools >>>>>>>>> rows = 10 >>>>>>>>> columns =5 >>>>>>>>> data = np.arange(rows*columns).reshape(rows,columns) >>>>>>>>> print('\n===Data===\n') >>>>>>>>> print(data) >>>>>>>>> to_mix = np.arange(rows) >>>>>>>>> mixed = list(itertools.product(to_mix,to_mix)) >>>>>>>>> combination = [x for x in mixed if (x[0]< x[1])] >>>>>>>>> combination = np.array(combination) >>>>>>>>> print('\n===Combination===\n') >>>>>>>>> print(combination) >>>>>>>>> >>>>>>>>> >>>>>>>>> final_data = >>>>>>>>> np.hstack((data[combination[:,0],:],data[combination[:,1],:])) >>>>>>>>> print('\n===Final Data===\n') >>>>>>>>> print(final_data) >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>> No entiendo muy bien qué quieres hacer. Si tienes Pandas, tienes >>>>>>>> Numpy.¿Por qué no simplemente haces un DataFrame usando el numpy array >>>>>>>> final que has obtenido? >>>>>>>> >>>>>>>> Sin usar numpy (que deberías tener instalado porque tienes Pandas >>>>>>>> instalado, repito): >>>>>>>> >>>>>>>> from itertools import combinations >>>>>>>> >>>>>>>> lista = [list(range(i,i+5)) for i in range(0,50,5)] >>>>>>>> final = [] >>>>>>>> for i in combinations(range(10),2): >>>>>>>> final.append(lista[i[0]]+lista[i[1]]) >>>>>>>> df = pd.DataFrame(final, columns = range(10)) >>>>>>>> >>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> Resultado: >>>>>>>>> >>>>>>>>> ===Data=== >>>>>>>>> >>>>>>>>> [[ 0 1 2 3 4] >>>>>>>>> [ 5 6 7 8 9] >>>>>>>>> [10 11 12 13 14] >>>>>>>>> ..., >>>>>>>>> [35 36 37 38 39] >>>>>>>>> [40 41 42 43 44] >>>>>>>>> [45 46 47 48 49]] >>>>>>>>> >>>>>>>>> ===Combination=== >>>>>>>>> >>>>>>>>> [[0 1] >>>>>>>>> [0 2] >>>>>>>>> [0 3] >>>>>>>>> ..., >>>>>>>>> [7 8] >>>>>>>>> [7 9] >>>>>>>>> [8 9]] >>>>>>>>> >>>>>>>>> ===Final Data=== >>>>>>>>> >>>>>>>>> [[ 0 1 2 ..., 7 8 9] >>>>>>>>> [ 0 1 2 ..., 12 13 14] >>>>>>>>> [ 0 1 2 ..., 17 18 19] >>>>>>>>> ..., >>>>>>>>> [35 36 37 ..., 42 43 44] >>>>>>>>> [35 36 37 ..., 47 48 49] >>>>>>>>> [40 41 42 ..., 47 48 49]] >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> Al parecer no es tan sencillo crear un nuevo dataframe usando los >>>>>>>>> indices en panda. Espero que me puedan dar una orientación saludos. >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Arturo Muñoz Tolosa >>>>>>>>> >>>>>>>>> _______________________________________________ >>>>>>>>> Python-es mailing list >>>>>>>>> [email protected] >>>>>>>>> https://mail.python.org/mailman/listinfo/python-es >>>>>>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> Python-es mailing list >>>>>>>> [email protected] >>>>>>>> https://mail.python.org/mailman/listinfo/python-es >>>>>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Arturo Muñoz Tolosa >>>>>>> >>>>>>> _______________________________________________ >>>>>>> Python-es mailing list >>>>>>> [email protected] >>>>>>> https://mail.python.org/mailman/listinfo/python-es >>>>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>>>> >>>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> Python-es mailing list >>>>>> [email protected] >>>>>> https://mail.python.org/mailman/listinfo/python-es >>>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> Arturo Muñoz Tolosa >>>>> >>>>> _______________________________________________ >>>>> Python-es mailing list >>>>> [email protected] >>>>> https://mail.python.org/mailman/listinfo/python-es >>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>> >>>>> >>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> [email protected] >>>> https://mail.python.org/mailman/listinfo/python-es >>>> FAQ: http://python-es-faq.wikidot.com/ >>>> >>>> >>> >>> >>> -- >>> Arturo Muñoz Tolosa >>> >>> _______________________________________________ >>> Python-es mailing list >>> [email protected] >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >>> >>> >> >> _______________________________________________ >> Python-es mailing list >> [email protected] >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> > > > -- > Arturo Muñoz Tolosa > > _______________________________________________ > Python-es mailing list > [email protected] > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > >
_______________________________________________ Python-es mailing list [email protected] https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
