tutorial seleccionar recorrer hacer graficar filtrar español datos data con columnas array python arrays numpy pandas scikit-learn

python - seleccionar - ¿Cómo convertir un subconjunto de columnas de Data Frame en pandas en una matriz numpy?



recorrer data frame pandas (3)

Me pregunto si existe una manera más sencilla y eficiente de seleccionar un subconjunto de filas y columnas de un DataFrame de pandas.

Por ejemplo, dado este marco de datos:

df = DataFrame(np.random.rand(4,5), columns = list(''abcde'')) print df a b c d e 0 0.945686 0.000710 0.909158 0.892892 0.326670 1 0.919359 0.667057 0.462478 0.008204 0.473096 2 0.976163 0.621712 0.208423 0.980471 0.048334 3 0.459039 0.788318 0.309892 0.100539 0.753992

Solo quiero aquellas filas en las que el valor de la columna ''c'' es mayor que 0.5, pero solo necesito las columnas ''b'' y ''e'' para esas filas.

Este es el método que he ideado, ¿tal vez hay una mejor forma de "pandas"?

locs = [df.columns.get_loc(_) for _ in [''a'', ''d'']] print df[df.c > 0.5][locs] a d 0 0.945686 0.892892

Mi objetivo final es convertir el resultado en una matriz numpy para pasar a un algoritmo de regresión sklearn, así que usaré el código anterior de esta manera:

training_set = array(df[df.c > 0.5][locs])

... y eso me molesta ya que termino con una enorme copia de la matriz en la memoria. Tal vez hay una mejor manera para eso también?


Quizás algo como esto para el primer problema, simplemente puede acceder a las columnas por sus nombres:

>>> df = pd.DataFrame(np.random.rand(4,5), columns = list(''abcde'')) >>> df[df[''c'']>.5][[''b'',''e'']] b e 1 0.071146 0.132145 2 0.495152 0.420219

Para el segundo problema:

>>> df[df[''c'']>.5][[''b'',''e'']].values array([[ 0.07114556, 0.13214495], [ 0.49515157, 0.42021946]])


Use su valor directamente:

In [79]: df[df.c > 0.5][[''b'', ''e'']].values Out[79]: array([[ 0.98836259, 0.82403141], [ 0.337358 , 0.02054435], [ 0.29271728, 0.37813099], [ 0.70033513, 0.69919695]])


.loc acepta los selectores de fila y columna simultáneamente (al igual que .ix/.iloc FYI). Esto también se realiza en una sola pasada.

In [1]: df = DataFrame(np.random.rand(4,5), columns = list(''abcde'')) In [2]: df Out[2]: a b c d e 0 0.669701 0.780497 0.955690 0.451573 0.232194 1 0.952762 0.585579 0.890801 0.643251 0.556220 2 0.900713 0.790938 0.952628 0.505775 0.582365 3 0.994205 0.330560 0.286694 0.125061 0.575153 In [5]: df.loc[df[''c'']>0.5,[''a'',''d'']] Out[5]: a d 0 0.669701 0.451573 1 0.952762 0.643251 2 0.900713 0.505775

Y si quieres los valores (aunque esto debería pasar directamente a sklearn como está); marcos compatibles con la interfaz de matriz

In [6]: df.loc[df[''c'']>0.5,[''a'',''d'']].values Out[6]: array([[ 0.66970138, 0.45157274], [ 0.95276167, 0.64325143], [ 0.90071271, 0.50577509]])