[Python-es] Combinaciones no repetidas de renglones con numpy/pandas

AGTUGO agtugo en gmail.com
Mie Mayo 14 01:50:26 CEST 2014


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.


2014-05-13 14:49 GMT-05:00 Kiko <kikocorreoso en gmail.com>:

>
>
>
> El 13 de mayo de 2014, 20:52, AGTUGO <agtugo en gmail.com> 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 <kikocorreoso en gmail.com>:
>>
>>
>>>
>>>
>>> El 13 de mayo de 2014, 20:05, AGTUGO <agtugo en gmail.com> 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 <kikocorreoso en gmail.com>:
>>>>
>>>>
>>>>>
>>>>>
>>>>> El 13 de mayo de 2014, 18:31, AGTUGO <agtugo en gmail.com> 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 <kikocorreoso en gmail.com>:
>>>>>>
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> El 13 de mayo de 2014, 7:23, AGTUGO <agtugo en gmail.com> 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
>>>>>>>> Python-es en python.org
>>>>>>>> https://mail.python.org/mailman/listinfo/python-es
>>>>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Python-es mailing list
>>>>>>> Python-es en python.org
>>>>>>> https://mail.python.org/mailman/listinfo/python-es
>>>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Arturo Muñoz Tolosa
>>>>>>
>>>>>> _______________________________________________
>>>>>> Python-es mailing list
>>>>>> Python-es en python.org
>>>>>> https://mail.python.org/mailman/listinfo/python-es
>>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Python-es mailing list
>>>>> Python-es en python.org
>>>>> https://mail.python.org/mailman/listinfo/python-es
>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Arturo Muñoz Tolosa
>>>>
>>>> _______________________________________________
>>>> Python-es mailing list
>>>> Python-es en python.org
>>>> https://mail.python.org/mailman/listinfo/python-es
>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>
>>>>
>>>
>>> _______________________________________________
>>> Python-es mailing list
>>> Python-es en python.org
>>> https://mail.python.org/mailman/listinfo/python-es
>>> FAQ: http://python-es-faq.wikidot.com/
>>>
>>>
>>
>>
>> --
>> Arturo Muñoz Tolosa
>>
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>>
>>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>


-- 
Arturo Muñoz Tolosa
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140513/fafcbeba/attachment.html>


Más información sobre la lista de distribución Python-es