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.