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

AGTUGO agtugo en gmail.com
Mar Mayo 13 20:05:57 CEST 2014


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.


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


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