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.
.ix
ya que es ambiguo. Use.iloc
o.loc
si 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]
ix
ahora 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 usariloc
junto con laget_loc
función delcolumns
mé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.ix
indexa filas, no columnas. Pensé que el OP quería columnas.ix
acepta 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 entreCol1
yCol5
en ladf.columns
matriz. Es incorrecto decir queix
indexa filas. Ese es solo su uso más básico. También admite mucha más indexación que eso. Entonces,ix
es perfectamente general para esta pregunta..iloc
que 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
.loc
indexador:es equivalente a
y devuelve columnas a
C
travé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:
.loc
tambié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.ix
corta las columnas un poco más concisamente, pero el.columns
interfaz 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 unaDataFrame
columna. Esa misma etiqueta también se usa para eldf.index
atributo real , unaIndex
matriz. Entonces su columna es devuelta pordf['index']
y el índice real de DataFrame es devuelto pordf.index
. UnIndex
es un tipo especial deSeries
optimización para la búsqueda de los valores de sus elementos. Para df.index es para buscar filas por su etiqueta. Esedf.columns
atributo también es unapd.Index
matriz, para buscar columnas por sus etiquetas.fuente
.ix
es 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.T
columns[1:3]
columns
Series
columns[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.columns
y 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.columns
es 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 columnab
comofoo
y la columnac
comobar
?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
b
yc
.El
drop
mé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
.loc
o[]
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_2
También puede seleccionar columnas y filas de estas filas usando
.loc()
. Esto se llama "rebanar" . Tenga en cuenta que tomo de la columnaTest_1
aTest_3
La "rebanada" es:
Y si solo quieres
Peter
yAnn
desde columnasTest_1
yTest_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
ix
ha 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 5
fuente
df1 = df[df.columns.difference(columns_for_differencing)]
devolverá un marco de datos nuevo / copiado. Podrá modificardf1
sin 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.filter
método para filtrar o reordenar columnas como esta:fuente
fuente