Recientemente comencé a bifurcarme desde mi lugar seguro (R) en Python y estoy un poco confundido por la localización / selección celular en Pandas. He leído la documentación pero me cuesta entender las implicaciones prácticas de las diversas opciones de localización / selección.
- ¿Hay alguna razón por la que debe utilizar cada vez 
.loco.ilocsobre la opción más general.ix? - Entiendo que 
.loc,iloc,at, yiatpuede proporcionar una cierta corrección garantizado que.ixno pueden ofrecer, pero también he leído que.ixtiende a ser la solución más rápida a través del tablero. - Por favor, explique el razonamiento de las mejores prácticas del mundo real detrás de la utilización de otra cosa que no sea 
.ix? 

loces una indexación basada en etiquetas, por lo que, básicamente, buscar un valor en una fila,iloces una indexación basada en filas enteras,ixes un método general que primero realiza una etiqueta basada, si eso falla, entonces cae en un número entero.atestá en desuso y se recomienda que ya no lo uses. La otra cosa a tener en cuenta es lo que está tratando de hacer, ya que algunos de estos métodos permiten el corte y la asignación de columnas, para ser honesto, los documentos son bastante claros: pandas.pydata.org/pandas-docs/stable/indexing.htmlatestá en desuso? No lo veo en los documentos at (o iat ).loc,ixyilocaquí: stackoverflow.com/questions/31593201/…Respuestas:
loc: solo funciona en el índice
iloc: trabaja en la posición
ix: puede obtener datos del marco de datos sin que esté en el índice
en: obtener valores escalares. Es una
ubicación muy rápida : obtenga valores escalares. Es un iloc muy rápido
http://pyciencia.blogspot.com/2015/05/obtener-y-filtrar-datos-de-un-dataframe.html
Nota: A partir de ahora
pandas 0.20.0, el.ixindexador está en desuso a favor de los más estrictos.iloce.locindexadores.fuente
atyiatson versiones muy rápidas delocyiloc, a continuación, por qué el usolocyilocen absoluto?atyiatun medio para acceder a un escalar, es decir, un único elemento en el marco de datos, mientras quelocyiloctienen acceso a varios elementos al mismo tiempo, potencialmente para realizar operaciones vectorizadas.Actualizado por
pandas0.20dado queixestá en desuso. Esto demuestra no sólo cómo utilizarloc,iloc,at,iat,set_value, pero cómo llevar a cabo, la indexación basada / etiqueta de posición mixta.loc- basado en etiquetasLe permite pasar matrices 1-D como indexadores. Las matrices pueden ser secciones (subconjuntos) del índice o columna, o pueden ser matrices booleanas que son de igual longitud que el índice o las columnas.
Nota especial: cuando se pasa un indexador escalar,
locpuede asignar un nuevo índice o valor de columna que no existía antes.iloc- basado en posiciónSimilar a
locexcepto con posiciones en lugar de valores de índice. Sin embargo, no puede asignar nuevas columnas o índices.at- basado en etiquetasFunciona de manera muy similar a
loclos indexadores escalares. No se puede operar en indexadores de matriz. ¡Poder! Asignar nuevos índices y columnas.Ventaja más
loces que esto es más rápido.La desventaja es que no puede usar matrices para indexadores.
iat- Trabajos basados en posición demanera similar a
iloc. No se puede trabajar en indexadores de matriz. ¡No puedo! Asignar nuevos índices y columnas.Ventaja más
iloces que esto es más rápido.La desventaja es que no puede usar matrices para indexadores.
set_value- basado en etiquetasFunciona de manera muy similar a
loclos indexadores escalares. No se puede operar en indexadores de matriz. ¡Poder! asignar nuevos índices y columnasVentaja ¡ Súper rápido, porque hay muy poca sobrecarga!
Desventaja Hay muy pocos gastos generales porque
pandasno se realizan muchas comprobaciones de seguridad. Use bajo su propio riesgo . Además, esto no está destinado al uso público.set_valuewithtakable=True- position basedTrabaja de manera similar a
iloc. No se puede trabajar en indexadores de matriz. ¡No puedo! Asignar nuevos índices y columnas.Ventaja ¡ Súper rápido, porque hay muy poca sobrecarga!
Desventaja Hay muy pocos gastos generales porque
pandasno se realizan muchas comprobaciones de seguridad. Use bajo su propio riesgo . Además, esto no está destinado al uso público.fuente
set_valueha quedado en desuso a favor.aty.iatdesde la versión 0.21Hay dos formas principales en que los pandas hacen selecciones de un DataFrame.
La documentación utiliza el término posición para referirse a la ubicación de enteros . No me gusta esta terminología porque siento que es confusa. La ubicación de enteros es más descriptiva y es exactamente lo que
.ilocsignifica. La palabra clave aquí es INTEGER : debe usar enteros al seleccionar por ubicación de enteros.Antes de mostrar el resumen, asegurémonos de que ...
.ix está en desuso y es ambiguo y nunca debe usarse
Hay tres indexadores principales para los pandas. Tenemos el operador de indexación en sí (los corchetes
[]).loc, y.iloc. Resumamos ellos:[]- Principalmente selecciona subconjuntos de columnas, pero también puede seleccionar filas. No se pueden seleccionar simultáneamente filas y columnas..loc- selecciona subconjuntos de filas y columnas solo por etiqueta.iloc- selecciona subconjuntos de filas y columnas solo por ubicación enteraCasi nunca uso
.ato.iatya que no agregan funcionalidad adicional y con solo un pequeño aumento de rendimiento. Desalentaría su uso a menos que tenga una aplicación muy urgente. En cualquier caso, tenemos su resumen:.atselecciona un solo valor escalar en el Marco de datos solo por etiqueta.iatselecciona un solo valor escalar en el Marco de datos solo por ubicación enteraAdemás de la selección por etiqueta y ubicación de enteros, existe una selección booleana también conocida como indexación booleana .
Ejemplos explicar
.loc,.iloc, selección booleana y.aty.iatse muestran a continuaciónPrimero nos centraremos en las diferencias entre
.locy.iloc. Antes de hablar sobre las diferencias, es importante comprender que los marcos de datos tienen etiquetas que ayudan a identificar cada columna y cada fila. Echemos un vistazo a un DataFrame de muestra:Todas las palabras en negrita son las etiquetas. Las etiquetas,
age,color,food,height,scoreystatese utilizan para las columnas . Las otras etiquetas,Jane,Nick,Aaron,Penelope,Dean,Christina,Corneliase utilizan como etiquetas para las filas. Colectivamente, estas etiquetas de fila se conocen como el índice .Las formas principales de seleccionar filas particulares en un DataFrame son con los indexadores
.locy.iloc. Cada uno de estos indexadores también se puede usar para seleccionar columnas simultáneamente, pero por ahora es más fácil centrarse en las filas. Además, cada uno de los indexadores utiliza un conjunto de corchetes que siguen inmediatamente a su nombre para realizar sus selecciones..loc selecciona datos solo por etiquetas
Primero hablaremos sobre el
.locindexador que solo selecciona datos por las etiquetas de índice o columna. En nuestro DataFrame de muestra, hemos proporcionado nombres significativos como valores para el índice. Muchos DataFrames no tendrán nombres significativos y, por el contrario, solo usarán los enteros de 0 a n-1, donde n es la longitud (número de filas) del DataFrame.Hay muchas entradas diferentes que puede usar para
.loctres de ellas sonSeleccionar una sola fila con .loc con una cadena
Para seleccionar una sola fila de datos, coloque la etiqueta de índice dentro de los corchetes siguientes
.loc.Esto devuelve la fila de datos como una serie
Seleccionar varias filas con .loc con una lista de cadenas
Esto devuelve un DataFrame con las filas en el orden especificado en la lista:
Seleccionar varias filas con .loc con notación de corte
La notación de corte se define mediante valores de inicio, parada y paso. Al cortar por etiqueta, pandas incluye el valor de detención en el retorno. Los siguientes cortes de Aaron a Dean, inclusive. Su tamaño de paso no está definido explícitamente sino que está predeterminado en 1.
Los cortes complejos se pueden tomar de la misma manera que las listas de Python.
.iloc selecciona datos solo por ubicación entera
Pasemos ahora a
.iloc. Cada fila y columna de datos en un DataFrame tiene una ubicación entera que lo define. Esto se suma a la etiqueta que se muestra visualmente en la salida. La ubicación entera es simplemente el número de filas / columnas desde la parte superior / izquierda que comienza en 0.Hay muchas entradas diferentes que puede usar para
.iloctres de ellas sonSeleccionar una sola fila con .iloc con un entero
Esto devuelve la quinta fila (ubicación entera 4) como una serie
Seleccionar varias filas con .iloc con una lista de enteros
Esto devuelve un DataFrame de la tercera y la penúltima fila:
Selección de varias filas con .iloc con notación de corte
Selección simultánea de filas y columnas con .loc y .iloc
Una excelente habilidad de ambos
.loc/.iloces su habilidad para seleccionar filas y columnas simultáneamente. En los ejemplos anteriores, todas las columnas fueron devueltas de cada selección. Podemos elegir columnas con los mismos tipos de entradas que para las filas. Simplemente necesitamos separar la selección de fila y columna con una coma .Por ejemplo, podemos seleccionar las filas Jane y Dean con solo la altura de las columnas, la puntuación y el estado de esta manera:
Esto usa una lista de etiquetas para las filas y la notación de corte para las columnas
Naturalmente, podemos hacer operaciones similares
.ilocusando solo enteros.Selección simultánea con etiquetas y ubicación de enteros
.ixse usó para hacer selecciones simultáneamente con etiquetas y ubicación de números enteros, lo que fue útil pero confuso y ambiguo a veces y, afortunadamente, ha quedado en desuso. En el caso de que necesite hacer una selección con una combinación de etiquetas y ubicaciones de enteros, deberá realizar tanto las etiquetas de selección como las ubicaciones de enteros.Por ejemplo, si queremos seleccionar filas
NickyCorneliajunto con las columnas 2 y 4, podríamos usar.locconvirtiendo los enteros en etiquetas con lo siguiente:O, alternativamente, convierta las etiquetas de índice a enteros con el
get_locmétodo de índice.Selección booleana
El indexador .loc también puede hacer una selección booleana. Por ejemplo, si estamos interesados en encontrar todas las filas donde la edad es superior a 30 y devolver solo las columnas
foodyscore, podemos hacer lo siguiente:Puede replicar esto con,
.ilocpero no puede pasarle una serie booleana. Debe convertir la serie booleana en una matriz numpy como esta:Seleccionar todas las filas
Es posible usar
.loc/.ilocsolo para la selección de columnas. Puede seleccionar todas las filas utilizando dos puntos como este:El operador de indexación
[], puede dividir puede seleccionar filas y columnas también, pero no simultáneamente.La mayoría de las personas están familiarizadas con el propósito principal del operador de indexación DataFrame, que es seleccionar columnas. Una cadena selecciona una sola columna como Serie y una lista de cadenas selecciona varias columnas como un Marco de datos.
Usar una lista selecciona múltiples columnas
Lo que la gente está menos familiarizada es que, cuando se utiliza la notación de corte, la selección se realiza mediante etiquetas de fila o por ubicación de enteros. Esto es muy confuso y es algo que casi nunca uso, pero funciona.
La especificidad de
.loc/.ilocpara seleccionar filas es altamente preferida. El operador de indexación solo no puede seleccionar filas y columnas simultáneamente.Selección por
.aty.iatLa selección con
.ates casi idéntica.locpero solo selecciona una única 'celda' en su DataFrame. Generalmente nos referimos a esta celda como un valor escalar. Para usar.at, pásele una etiqueta de fila y columna separada por una coma.La selección con
.iates casi idéntica.ilocpero solo selecciona un único valor escalar. Debe pasarle un número entero para las ubicaciones de fila y columnafuente
fuente
Comencemos con este pequeño df:
Así que tendremos
Con esto tenemos:
Por lo tanto, no podemos usar .iat para el subconjunto, donde solo debemos usar .iloc.
Pero intentemos seleccionar entre un df más grande y verifiquemos la velocidad ...
Entonces, con .loc podemos administrar subconjuntos y con .at solo un escalar, pero .at es más rápido que .loc
:-)
fuente