sirven que programacion programa potencia para metodos los lista intersección entre diferencia conjuntos conjunto python arrays r numpy subset

programacion - para que sirven los conjuntos en python



Subconjunto de datos en Python (3)

Como no estoy familiarizado con R ni cómo funciona este comando de subconjunto basado en su descripción, puedo sugerirle que analice la funcionalidad groupby de itertool. Si se le asigna una función que genera un valor, puede formar grupos según la salida de esa función. Tomado de groupby :

groups = [] uniquekeys = [] data = sorted(data, key=keyfunc) for k, g in groupby(data, keyfunc): groups.append(list(g)) # Store group iterator as a list uniquekeys.append(k)

y luego tienes tus subconjuntos. Sin embargo, tenga cuidado ya que los valores devueltos no son listas completas. Son iteradores.

Estoy asumiendo que sus valores se están devolviendo fila por fila.

Quiero usar el equivalente del comando de subconjunto en R para algún código Python que estoy escribiendo.

Aquí están mis datos:

col1 col2 col3 col4 col5 100002 2006 1.1 0.01 6352 100002 2006 1.2 0.84 304518 100002 2006 2 1.52 148219 100002 2007 1.1 0.01 6292 10002 2006 1.1 0.01 5968 10002 2006 1.2 0.25 104318 10002 2007 1.1 0.01 6800 10002 2007 4 2.03 25446 10002 2008 1.1 0.01 6408

Quiero col2 los datos basados ​​en los contenidos de col1 y col2 . (Los valores únicos en col1 son 100002 y 10002, y en col2 son 2006,2007 y 2008.)

Esto se puede hacer en R usando el comando de subconjunto, ¿hay algo similar en Python?


Si bien las respuestas basadas en iteradores están perfectamente bien, si está trabajando con matrices numpy (como menciona que es), existen formas mejores y más rápidas de seleccionar cosas:

import numpy as np data = np.array([ [100002, 2006, 1.1, 0.01, 6352], [100002, 2006, 1.2, 0.84, 304518], [100002, 2006, 2, 1.52, 148219], [100002, 2007, 1.1, 0.01, 6292], [10002, 2006, 1.1, 0.01, 5968], [10002, 2006, 1.2, 0.25, 104318], [10002, 2007, 1.1, 0.01, 6800], [10002, 2007, 4, 2.03, 25446], [10002, 2008, 1.1, 0.01, 6408] ]) subset1 = data[data[:,0] == 100002] subset2 = data[data[:,0] == 10002]

Esto produce

subconjunto 1:

array([[ 1.00002e+05, 2.006e+03, 1.10e+00, 1.00e-02, 6.352e+03], [ 1.00002e+05, 2.006e+03, 1.20e+00, 8.40e-01, 3.04518e+05], [ 1.00002e+05, 2.006e+03, 2.00e+00, 1.52e+00, 1.48219e+05], [ 1.00002e+05, 2.007e+03, 1.10e+00, 1.00e-02, 6.292e+03]])

subconjunto 2:

array([[ 1.0002e+04, 2.006e+03, 1.10e+00, 1.00e-02, 5.968e+03], [ 1.0002e+04, 2.006e+03, 1.20e+00, 2.50e-01, 1.04318e+05], [ 1.0002e+04, 2.007e+03, 1.10e+00, 1.00e-02, 6.800e+03], [ 1.0002e+04, 2.007e+03, 4.00e+00, 2.03e+00, 2.5446e+04], [ 1.0002e+04, 2.008e+03, 1.10e+00, 1.00e-02, 6.408e+03]])

Si no conocía los valores únicos en la primera columna de antemano, puede usar numpy.unique1d o el set funciones incorporadas para encontrarlos.

Edición: Me acabo de dar cuenta de que querías seleccionar datos donde tengas combinaciones únicas de dos columnas ... En ese caso, podrías hacer algo como esto:

col1 = data[:,0] col2 = data[:,1] subsets = {} for val1, val2 in itertools.product(np.unique(col1), np.unique(col2)): subset = data[(col1 == val1) & (col2 == val2)] if np.any(subset): subsets[(val1, val2)] = subset

(Estoy almacenando los subconjuntos como un dict, con la clave como una tupla de la combinación ... Ciertamente hay otras (y mejores, dependiendo de lo que estés haciendo) formas de hacer esto)


subset() en R es bastante similar a filter() en Python. Como las notas de referencia, esto se utilizará implícitamente en las listas de comprensión, por lo que la forma más clara y concisa de escribir el código podría ser

[ item for item in items if item.col2 == 2006 ]

si, por ejemplo, sus filas de datos estaban en un items llamado iterable.