Tengo datos en diferentes columnas pero no sé cómo extraerlos para guardarlos en otra variable.
index a b c
1 2 3 4
2 3 4 5
¿Cómo selecciono 'a', 'b'y guardarlo en que gl1?
Lo intenté
df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']
Ninguno parece funcionar.

.ixya que es ambiguo. Use.iloco.locsi debe hacerlo.> csvtable_imp_1 <- csvtable_imp[0:6]y selecciona la cantidad delta de las primeras columnas entre 0 y 6. Todo lo que tuve que hacer es leer la tabla csv como delimitada con el libr readr.infile_1 = largefile_stay.ix[:,0:6]ixahora está en desuso. Pandas recomienda usar:loc(indexación basada en etiquetas) oiloc(indexación basada en posición).Respuestas:
Los nombres de columna (que son cadenas) no se pueden dividir de la manera que lo intentó.
Aquí tienes un par de opciones. Si conoce por contexto qué variables desea dividir, puede devolver una vista solo de esas columnas pasando una lista a la
__getitem__sintaxis (las [] 's).Alternativamente, si es importante indexarlos numéricamente y no por su nombre (digamos que su código debe hacer esto automáticamente sin conocer los nombres de las dos primeras columnas), puede hacerlo en su lugar:
Además, debe familiarizarse con la idea de una vista de un objeto Pandas versus una copia de ese objeto. El primero de los métodos anteriores devolverá una nueva copia en memoria del subobjeto deseado (los segmentos deseados).
A veces, sin embargo, hay convenciones de indexación en Pandas que no hacen esto y, en cambio, le dan una nueva variable que solo se refiere al mismo fragmento de memoria que el subobjeto o el segmento en el objeto original. Esto sucederá con la segunda forma de indexación, por lo que puede modificarlo con la
copy()función para obtener una copia regular. Cuando esto sucede, cambiar lo que crees que es el objeto cortado a veces puede alterar el objeto original. Siempre es bueno estar atento a esto.Para usarlo
iloc, debe conocer las posiciones de columna (o índices). Como las posiciones de las columnas pueden cambiar, en lugar de los índices de codificación rígida, puede usarilocjunto con laget_locfunción delcolumnsmétodo del objeto de marco de datos para obtener índices de columnas.Ahora puede usar este diccionario para acceder a las columnas a través de los nombres y el uso
iloc.fuente
df[['a','b']]produce una copiaix[]si usted prefiere utilizarix[]por cualquier razón.ixindexa filas, no columnas. Pensé que el OP quería columnas.ixacepta argumentos de corte, por lo que también puede obtener columnas. Por ejemplo,df.ix[0:2, 0:2]obtiene la submatriz 2x2 superior izquierda al igual que lo hace para una matriz NumPy (dependiendo de los nombres de las columnas, por supuesto). Incluso puede usar la sintaxis de corte en los nombres de cadena de las columnas, comodf.ix[0, 'Col1':'Col5']. Eso obtiene todas las columnas que están ordenadas entreCol1yCol5en ladf.columnsmatriz. Es incorrecto decir queixindexa filas. Ese es solo su uso más básico. También admite mucha más indexación que eso. Entonces,ixes perfectamente general para esta pregunta..ilocque es exclusivo de la última posición al igual que las listas de Python.A partir de la versión 0.11.0, las columnas se pueden dividir de la manera que intentó usar el
.locindexador:es equivalente a
y devuelve columnas a
CtravésE.Una demostración en un DataFrame generado aleatoriamente:
Para obtener las columnas de C a E (tenga en cuenta que, a diferencia de la división de enteros, se incluye 'E' en las columnas):
Lo mismo funciona para seleccionar filas basadas en etiquetas. Obtenga las filas 'R6' a 'R10' de esas columnas:
.loctambién acepta una matriz booleana para que pueda seleccionar las columnas cuya entrada correspondiente en la matriz esTrue. Por ejemplo,df.columns.isin(list('BCD'))devuelvearray([False, True, True, True, False, False], dtype=bool): verdadero si el nombre de la columna está en la lista['B', 'C', 'D']; Falso, de lo contrario.fuente
Suponiendo que los nombres de sus columnas (
df.columns) son['index','a','b','c'], entonces los datos que desea están en las columnas 3ra y 4ta. Si no conoce sus nombres cuando se ejecuta su script, puede hacerloComo EMS señala en su respuesta ,
df.ixcorta las columnas un poco más concisamente, pero el.columnsinterfaz de corte podría ser más natural porque usa la sintaxis de indexación / corte de lista de python vainilla 1-D.WARN:
'index'es un mal nombre para unaDataFramecolumna. Esa misma etiqueta también se usa para eldf.indexatributo real , unaIndexmatriz. Entonces su columna es devuelta pordf['index']y el índice real de DataFrame es devuelto pordf.index. UnIndexes un tipo especial deSeriesoptimización para la búsqueda de los valores de sus elementos. Para df.index es para buscar filas por su etiqueta. Esedf.columnsatributo también es unapd.Indexmatriz, para buscar columnas por sus etiquetas.fuente
.ixes solo para filas. Es para rebanar de propósito general, y puede usarse para rebanar multidimensional. Básicamente es solo una interfaz para la sintaxis habitual de NumPy . Dicho esto, se puede convertir fácilmente en un problema de columna sobre el tramo en un problema fila sobre el tramo aplicando sólo una operación de transposición, . Su ejemplo usa , lo cual es un poco engañoso. El resultado de es a ; tenga cuidado de no tratarlo simplemente como una matriz. Además, probablemente debería cambiarlo para que coincida con su comentario "3 ° y 4 °".__getitem__df.Tcolumns[1:3]columnsSeriescolumns[2:3][2:4]es correcto. Tu[2:3]está equivocado. Y el uso de la notación de corte estándar de Python para generar una secuencia / Serie no es engañoso en mi opinión. Pero me gusta que evite la interfaz DataFrame para acceder a la matriz numpy subyacenteix.df.columnsy desea dividirlo por etiqueta , entonces tendría una semántica de corte diferente que si lo corta por posición de índice entero . Sin embargo, definitivamente no lo expliqué bien en mi comentario anterior.columnses una Serie inmutable y el getter ha sido anulado para usar etiquetas como índices. Gracias por tomarte el tiempo de aclarar.fuente
df[['b as foo', 'c as bar']tal que la salida cambia el nombre de la columnabcomofooy la columnaccomobar?df[['b', 'c']].rename(columns = {'b' : 'foo', 'c' : 'bar'})Me doy cuenta de que esta pregunta es bastante antigua, pero en la última versión de pandas hay una manera fácil de hacer exactamente esto. Los nombres de columna (que son cadenas) se pueden dividir de la forma que desee.
fuente
Puede proporcionar una lista de columnas para descartar y devolver el DataFrame con solo las columnas necesarias utilizando el
drop()función en un Pandas DataFrame.Solo digo
devolvería un DataFrame con solo las columnas
byc.El
dropmétodo está documentado aquí .fuente
Con pandas
nombres de columnas ingeniosas
para seleccionar por iloc y columnas específicas con número de índice:
con los nombres de columna loc se pueden usar como
fuente
Encontré este método muy útil:
Más detalles se pueden encontrar aquí
fuente
surveys_df.iloc [:, [2,5]]entonces.A partir de 0.21.0, el uso de
.loco[]con una lista con una o más etiquetas faltantes está en desuso a favor de.reindex. Entonces, la respuesta a su pregunta es:df1 = df.reindex(columns=['b','c'])En versiones anteriores, el uso
.loc[list-of-labels]funcionaría siempre que se encontrara al menos 1 de las claves (de lo contrario, generaría aKeyError). Este comportamiento está en desuso y ahora muestra un mensaje de advertencia. La alternativa recomendada es usar.reindex().Lea más en Indización y selección de datos
fuente
Puedes usar pandas. Creo el DataFrame:
El DataFrame:
Para seleccionar 1 o más columnas por nombre:
También puedes usar:
Y tu consigues columna
Test_2También puede seleccionar columnas y filas de estas filas usando
.loc(). Esto se llama "rebanar" . Tenga en cuenta que tomo de la columnaTest_1aTest_3La "rebanada" es:
Y si solo quieres
PeteryAnndesde columnasTest_1yTest_3:Usted obtiene:
fuente
Si desea obtener un elemento por índice de fila y nombre de columna, puede hacerlo de la misma manera
df['b'][0]. Es tan simple como puedes imaginar.O puedes usar
df.ix[0,'b'], uso mixto de índice y etiqueta.Nota: Desde v0.20
ixha quedado en desuso a favor deloc/iloc.fuente
Un enfoque diferente y fácil: iterar filas
usando iterows
fuente
Los diferentes enfoques discutidos en las respuestas anteriores se basan en la suposición de que el usuario conoce los índices de columna para colocar o subconjunto, o el usuario desea subconjugar un marco de datos utilizando un rango de columnas (por ejemplo, entre 'C': 'E') . pandas.DataFrame.drop () es ciertamente una opción para subconjunto de datos en base a una lista de columnas definidas por el usuario (¡aunque debe tener cuidado de que siempre use una copia del marco de datos y los parámetros in situ no deben establecerse en True !)
Otra opción es usar pandas.columns.difference () , que marca una diferencia en los nombres de columna y devuelve un tipo de matriz de índice que contiene las columnas deseadas. La siguiente es la solución:
El resultado sería:
b c 1 3 4 2 4 5fuente
df1 = df[df.columns.difference(columns_for_differencing)]devolverá un marco de datos nuevo / copiado. Podrá modificardf1sin alterardf. Gracias, por cierto. Esto era exactamente lo que necesitaba.también puedes usar df.pop ()
avíseme si esto le ayuda, por favor use df.pop (c)
fuente
He visto varias respuestas sobre eso, pero no me quedó claro. ¿Cómo seleccionarías esas columnas de interés? La respuesta a eso es que si los tiene reunidos en una lista, puede hacer referencia a las columnas usando la lista.
Ejemplo
Tengo la siguiente lista / matriz numpy
extracted_features, que especifica 63 columnas. El conjunto de datos original tiene 103 columnas, y me gustaría extraer exactamente esas, luego usaríaY terminarás con esto
Esto es algo que usaría con bastante frecuencia en Machine Learning (más específicamente, en la selección de funciones). Me gustaría discutir otras formas también, pero creo que eso ya ha sido cubierto por otros stackoverflowers. ¡Espero que esto haya sido útil!
fuente
Puede usar el
pandas.DataFrame.filtermétodo para filtrar o reordenar columnas como esta:fuente
fuente