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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top