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

Kiko kikocorreoso en gmail.com
Mar Mayo 13 20:09:21 CEST 2014


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/
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140513/205d4966/attachment.html>


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