Cargo algunos datos de aprendizaje automático de un archivo CSV. Las primeras 2 columnas son observaciones y las columnas restantes son características.
Actualmente, hago lo siguiente:
data = pandas.read_csv('mydata.csv')
que da algo como:
data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
Me gustaría cortar esta trama de datos en dos tramas de datos: una que contiene las columnas a
y b
y uno que contiene las columnas c
, d
ye
.
No es posible escribir algo como
observations = data[:'c']
features = data['c':]
No estoy seguro de cuál es el mejor método. ¿Necesito unpd.Panel
?
Por cierto, la indexación de marcos de datos me parece bastante inconsistente: data['a']
está permitido, pero data[0]
no lo está. Por otro lado, data['a':]
no está permitido pero sí data[0:]
. ¿Hay alguna razón práctica para esto? Esto es realmente confuso si las columnas son indexadas por Int, dado quedata[0] != data[0:1]
df[5:10]
se agregaron algunas comodidades, por ejemplo, para seleccionar filas ( pandas.pydata.org/pandas-docs/stable/… )Respuestas:
Respuesta 2017 - pandas 0.20: .ix está en desuso. Usa .loc
Ver la desaprobación en los documentos
.loc
usa indexación basada en etiquetas para seleccionar tanto filas como columnas. Las etiquetas son los valores del índice o las columnas. Cortar con.loc
incluye el último elemento..loc
acepta la misma notación de corte que las listas de Python para las filas y las columnas. Ser notación de rebanadastart:stop:step
Puede cortar por filas y columnas. Por ejemplo, si usted tiene 5 filas con etiquetas
v
,w
,x
,y
,z
fuente
df['newcol'] = df.apply(lambda row: myfunc(row), axis=1)
entonces puede enmyfunc(row){
... usarrow['foo':'ant']
. por ejemplo (de acuerdo con esta respuesta de StackOverflow ), dentro de lamyfunc
puede evaluar si alguno de estos no es numérico:row['foo':'ant'].apply(lambda x: isinstance(x, str)).any()
.iloc
debe usarse ahora, en lugar de.loc
. Arregla eso, y lo votaré.Nota:
.ix
ha quedado en desuso desde Pandas v0.20. En su lugar, debe usar.loc
o.iloc
, según corresponda.El índice DataFrame.ix es a lo que desea acceder. Es un poco confuso (estoy de acuerdo en que la indexación de Pandas es desconcertante a veces), pero lo siguiente parece hacer lo que quieres:
donde .ix [segmento de fila, segmento de columna] es lo que se está interpretando. Más información sobre la indexación de Pandas aquí: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced
fuente
>>>data.ix[:, 'a':'c'] a b c 0 0.859192 0.881433 0.843624 1 0.744979 0.427986 0.177159
df.ix[:,[0,3,4]]
df.ix[:,'b':'e']
?loc
lugar deix
: stackoverflow.com/a/31593712/4323Usemos el conjunto de datos titánico del paquete seaborn como ejemplo
o
fuente
.ix
está en desuso.Passing list-likes to .loc or [] with any missing label will raise KeyError in the future, you can use .reindex() as an alternative.
cuando usadf.loc[:, some_list_of_columns]
Además, dado un marco de datos
como en su ejemplo, si desea extraer la columna ayd solamente (es decir, la 1ra y la 4ta columna), iloc mothod del marco de datos de pandas es lo que necesita y podría usarse de manera muy efectiva. Todo lo que necesita saber es el índice de las columnas que desea extraer. Por ejemplo:
Te regalaré
fuente
Puede dividir las columnas de a
DataFrame
haciendo referencia a los nombres de cada columna en una lista, así:fuente
get_loc
funcióndata.columns
para determinar el índice de la columna 'b' o lo que sea.Y si viniste aquí buscando cortar dos rangos de columnas y combinarlas (como yo), puedes hacer algo como
Esto creará un nuevo marco de datos con las primeras 900 columnas y (todas) las columnas> 3593 (suponiendo que tenga unas 4000 columnas en su conjunto de datos).
fuente
A continuación, le mostramos cómo puede utilizar diferentes métodos para dividir en columnas de forma selectiva, incluidas la división selectiva de columnas basada en etiquetas, índices y rangos selectivos.
fuente
Su equivalente
fuente
si el marco de datos se ve así:
y SALIDA podría ser como
si usa el operador lógico np.logical_not
más sobre
https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.logic.html
otros operadores lógicos
logical_and (x1, x2, / [, out, where, ...]) Calcule el valor de verdad de x1 AND x2 por elementos.
logical_or (x1, x2, / [, out, where, casting, ...]) Calcule el valor de verdad de x1 OR x2 por elementos.
fuente
Otra forma de obtener un subconjunto de columnas de su DataFrame, suponiendo que desea todas las filas, sería hacer:
data[['a','b']]
ydata[['c','d','e']]
si desea usar índices numéricos de columna, puede hacer:
data[data.columns[:2]]
ydata[data.columns[2:]]
fuente