Subconjunto de datos en Python
Pregunta
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 subconjunto de los datos en función del contenido 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 subset, ¿hay algo similar en Python?
Solución
Si bien las respuestas basadas en iterador están perfectamente bien, si se trabaja con matrices numpy (como usted menciona que son) hay mejores y más rápido maneras 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]
Este rendimientos
subset1:
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]])
subset2:
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 conoce los valores singulares de la primera columna de antemano, puede utilizar cualquiera numpy.unique1d
o la set
función incorporada para encontrarlos.
Edit: Me di cuenta de que quería seleccionar datos donde se tiene una combinación única de dos columnas ... En ese caso, es posible 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 diccionario, donde la clave es una tupla de la combinación ... Es cierto que hay otra (y mejor, en función de lo que está haciendo) maneras de hacer esto!)
Otros consejos
subset()
en I es más o menos análoga a filter()
en Python. Como las notas de referencia, esto va a ser utilizado implícitamente por las listas por comprensión, por lo que el más concisa y clara forma de escribir el código podría ser
[ item for item in items if item.col2 == 2006 ]
si, por ejemplo, sus filas de datos se encontraban en una llamada items
iterable.
Como no estoy familiarizado con R ni con cómo funciona este comando de subconjunto según su descripción, puedo sugerirle que eche un vistazo a la funcionalidad groupby de itertool.Si se le asigna una función que genera un valor, puede formar grupos basados en la salida de esa función.Tomado de agrupar por:
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.
Supongo que sus valores se devuelven fila por fila.