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]])