Saltar al contenido

pandas loc vs. iloc vs. at vs. iat?

Al fin después de mucho trabajar pudimos encontrar el resultado de esta obstáculo que tantos lectores de nuestro sitio web han presentado. Si tienes algo que aportar no dudes en compartir tu comentario.

Solución:

loc: solo funciona en el índice
iloc: trabajar en la posición
a: obtener valores escalares. Es una locomotora muy rapida
Yo en: Obtenga valores escalares. Es un iloc muy rapido

También,

at y iat están destinados a acceder a un escalar, es decir, un solo elemento en el marco de datos, mientras que loc y iloc son mentos para acceder a varios elementos al mismo tiempo, potencialmente para realizar operaciones vectorizadas.

http://pyciencia.blogspot.com/2015/05/obtener-y-filtrar-datos-de-un-dataframe.html

Actualizado para pandas0.20 Dado que ix es obsoleto. Esto demuestra no solo cómo usar loc, iloc, at, iat, set_value, pero cómo lograr, indexación mixta basada en etiquetas / posicionales.


locbasado en etiquetas

Le permite pasar matrices 1-D como indexadores. Las matrices pueden ser porciones (subconjuntos) del índice o columna, o pueden ser matrices booleanas que tienen la misma longitud que el índice o las columnas.

Nota especial: cuando se pasa un indexador escalar, loc puede asignar un nuevo índice o valor de columna que no existía antes.

# label based, but we can use position values
# to get the labels from the index object
df.loc[df.index[2], 'ColName'] = 3

df.loc[df.index[1:3], 'ColName'] = 3

ilocbasado en la posición

Similar a loc excepto con posiciones en lugar de valores de índice. Sin embargo, tu no poder Asignar nuevas columnas o índices.

# position based, but we can get the position
# from the columns object via the `get_loc` method
df.iloc[2, df.columns.get_loc('ColName')] = 3

df.iloc[2, 4] = 3

df.iloc[:3, 2:4] = 3

atbasado en etiquetas

Funciona muy similar a loc para indexadores escalares. No poder operar en indexadores de matriz. ¡Poder! Asignar nuevos índices y columnas.

Ventaja sobre loc es que esto es más rápido.
Desventaja es que no puede usar matrices para indexadores.

# label based, but we can use position values
# to get the labels from the index object
df.at[df.index[2], 'ColName'] = 3

df.at['C', 'ColName'] = 3

iatbasado en la posición

Funciona de manera similar a iloc. No poder trabajar en indexadores de matriz. ¡No poder! Asignar nuevos índices y columnas.

Ventaja sobre iloc es que esto es más rápido.
Desventaja es que no puede usar matrices para indexadores.

# position based, but we can get the position
# from the columns object via the `get_loc` method
IBM.iat[2, IBM.columns.get_loc('PNL')] = 3

set_valuebasado en etiquetas

Funciona muy similar a loc para indexadores escalares. No poder operar en indexadores de matriz. ¡Poder! asignar nuevos índices y columnas

Ventaja ¡Súper rápido, porque hay muy pocos gastos generales!
Desventaja Hay muy poca sobrecarga porque pandas no está haciendo un montón de controles de seguridad. Úselo bajo su propio riesgo. Además, esto no está diseñado para uso público.

# label based, but we can use position values
# to get the labels from the index object
df.set_value(df.index[2], 'ColName', 3)

set_value con takable=Truebasado en la posición

Funciona de manera similar a iloc. No poder trabajar en indexadores de matriz. ¡No poder! Asignar nuevos índices y columnas.

Ventaja ¡Súper rápido, porque hay muy pocos gastos generales!
Desventaja Hay muy poca sobrecarga porque pandas no está haciendo un montón de controles de seguridad. Úselo bajo su propio riesgo. Además, esto no está diseñado para uso público.

# position based, but we can get the position
# from the columns object via the `get_loc` method
df.set_value(2, df.columns.get_loc('ColName'), 3, takable=True)

Hay dos formas principales en las que los pandas hacen selecciones desde un DataFrame.

  • Por Etiqueta
  • Por Ubicación entera

La documentación usa el término posición por referirse a ubicación entera. No me gusta esta terminología porque la siento confusa. La ubicación entera es más descriptiva y es exactamente lo que .iloc representa. La palabra clave aquí es ENTERO – debe usar números enteros al seleccionar por ubicación de números enteros.

Antes de mostrar el resumen, asegurémonos de que …

.ix está obsoleto y es ambiguo y nunca debe usarse

Hay tres primarios indexadores para pandas. Tenemos el propio operador de indexación (los corchetes []), .loc, y .iloc. Resumámoslos:

  • [] – Selecciona principalmente subconjuntos de columnas, pero también puede seleccionar filas. No se pueden seleccionar filas y columnas simultáneamente.
  • .loc – selecciona subconjuntos de filas y columnas solo por etiqueta
  • .iloc – selecciona subconjuntos de filas y columnas solo por ubicación de números enteros

Casi nunca uso .at o .iat ya que no añaden ninguna funcionalidad adicional y con solo un pequeño aumento de rendimiento. Desaconsejaría su uso a menos que tenga una aplicación muy urgente. Independientemente, tenemos su resumen:

  • .at selecciona un único valor escalar en el DataFrame solo por etiqueta
  • .iat selecciona un único valor escalar en el DataFrame solo por la ubicación del número entero

Además de la selección por etiqueta y ubicación entera, selección booleana también conocido como indexación booleana existe.


Ejemplos que explican .loc, .iloc, selección booleana y .at y .iat se muestran a continuación

Primero nos centraremos en las diferencias entre .loc y .iloc. Antes de hablar sobre las diferencias, es importante comprender que los DataFrames tienen etiquetas que ayudan a identificar cada columna y cada fila. Echemos un vistazo a un DataFrame de muestra:

df = pd.DataFrame('age':[30, 2, 12, 4, 32, 33, 69],
                   'color':['blue', 'green', 'red', 'white', 'gray', 'black', 'red'],
                   'food':['Steak', 'Lamb', 'Mango', 'Apple', 'Cheese', 'Melon', 'Beans'],
                   'height':[165, 70, 120, 80, 180, 172, 150],
                   'score':[4.6, 8.3, 9.0, 3.3, 1.8, 9.5, 2.2],
                   'state':['NY', 'TX', 'FL', 'AL', 'AK', 'TX', 'TX']
                   ,
                  index=['Jane', 'Nick', 'Aaron', 'Penelope', 'Dean', 'Christina', 'Cornelia'])

ingrese la descripción de la imagen aquí

Todas las palabras en negrita son las etiquetas. Las etiquetas, age, color, food, height, score y state se utilizan para el columnas. Las otras etiquetas, Jane, Nick, Aaron, Penelope, Dean, Christina, Cornelia se utilizan como etiquetas para las filas. En conjunto, estas etiquetas de fila se conocen como índice.


Las formas principales de seleccionar filas particulares en un DataFrame son con el .loc y .iloc indexadores. Cada uno de estos indexadores también se puede usar para seleccionar columnas simultáneamente, pero por ahora es más fácil enfocarse en las filas. Además, cada uno de los indexadores usa un conjunto de corchetes que siguen inmediatamente a su nombre para realizar sus selecciones.

.loc selecciona datos solo por etiquetas

Primero hablaremos sobre el .loc indexador que solo selecciona datos por el índice o las etiquetas de columna. En nuestro DataFrame de muestra, proporcionamos nombres significativos como valores para el índice. Muchos DataFrames no tendrán ningún nombre significativo y, en su lugar, de forma predeterminada solo los números enteros de 0 a n-1, donde n es la longitud (número de filas) del DataFrame.

Hay muchas entradas diferentes que puede utilizar para .loc tres de ellos son

  • Una cuerda
  • Una lista de cadenas
  • Corte en notación utilizando cadenas como valores de inicio y finalización

Seleccionar 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.

df.loc['Penelope']

Esto devuelve la fila de datos como una serie.

age           4
color     white
food      Apple
height       80
score       3.3
state        AL
Name: Penelope, dtype: object

Seleccionar varias filas con .loc con una lista de cadenas

df.loc[['Cornelia', 'Jane', 'Dean']]

Esto devuelve un DataFrame con las filas en el orden especificado en la lista:

ingrese la descripción de la imagen aquí

Seleccionar varias filas con .loc con notación de corte

La notación de sector se define mediante valores de inicio, parada y paso. Al cortar por etiqueta, pandas incluye el valor de parada en la devolución. Las siguientes secciones de Aaron a Dean, inclusive. Su tamaño de paso no se define explícitamente, sino que está predeterminado en 1.

df.loc['Aaron':'Dean']

ingrese la descripción de la imagen aquí

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 la define. Esto se suma a la etiqueta que se muestra visualmente en la salida. La ubicación del número entero es simplemente el número de filas / columnas desde la parte superior / izquierda comenzando en 0.

Hay muchas entradas diferentes que puede utilizar para .iloc tres de ellos son

  • Un entero
  • Una lista de enteros
  • Corte en notación utilizando números enteros como valores de inicio y finalización

Seleccionar una sola fila con .iloc con un número entero

df.iloc[4]

Esto devuelve la quinta fila (ubicación entera 4) como una serie

age           32
color       gray
food      Cheese
height       180
score        1.8
state         AK
Name: Dean, dtype: object

Seleccionar varias filas con .iloc con una lista de enteros

df.iloc[[2, -2]]

Esto devuelve un DataFrame de la tercera y la penúltima fila:

ingrese la descripción de la imagen aquí

Seleccionar varias filas con .iloc con notación de corte

df.iloc[:5:3]

ingrese la descripción de la imagen aquí


Selección simultánea de filas y columnas con .loc y .iloc

Una excelente habilidad de ambos .loc/.iloc es su capacidad para seleccionar filas y columnas simultáneamente. En los ejemplos anteriores, se devolvieron todas las columnas de cada selección. Podemos elegir columnas con los mismos tipos de entradas que hacemos para las filas. Simplemente necesitamos separar la selección de fila y columna con un 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:

df.loc[['Jane', 'Dean'], 'height':]

ingrese la descripción de la imagen aquí

Esto usa una lista de etiquetas para las filas y notación de corte para las columnas

Naturalmente, podemos hacer operaciones similares con .iloc usando solo números enteros.

df.iloc[[1,4], 2]
Nick      Lamb
Dean    Cheese
Name: food, dtype: object

Selección simultánea con etiquetas y ubicación de números enteros

.ix se usó para hacer selecciones simultáneamente con etiquetas y ubicación de números enteros, lo cual fue útil pero confuso y ambiguo en ocasiones y, afortunadamente, ha quedado obsoleto. En el caso de que necesite realizar una selección con una combinación de etiquetas y ubicaciones de números enteros, tendrá que realizar tanto las etiquetas de selección como las ubicaciones de números enteros.

Por ejemplo, si queremos seleccionar filas Nick y Cornelia junto con las columnas 2 y 4, podríamos usar .loc convirtiendo los números enteros en etiquetas con lo siguiente:

col_names = df.columns[[2, 4]]
df.loc[['Nick', 'Cornelia'], col_names] 

O, alternativamente, convierta las etiquetas de índice en números enteros con la get_loc método de índice.

labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]

Selección booleana

El indexador .loc también puede realizar una selección booleana. Por ejemplo, si estamos interesados ​​en encontrar todas las filas donde la edad es superior a 30 y devolver solo el food y score columnas podemos hacer lo siguiente:

df.loc[df['age'] > 30, ['food', 'score']] 

Puedes replicar esto con .iloc pero no puede pasarle una serie booleana. Debes convertir el booleano Series en una matriz numpy como esta:

df.iloc[(df['age'] > 30).values, [2, 4]] 

Seleccionar todas las filas

Es posible utilizar .loc/.iloc solo para la selección de columnas. Puede seleccionar todas las filas usando dos puntos como este:

df.loc[:, 'color':'score':2]

ingrese la descripción de la imagen aquí


El operador de indexación, [], puede cortar también puede seleccionar filas y columnas, pero no simultáneamente.

La mayoría de las personas están familiarizadas con el objetivo principal del operador de indexación DataFrame, que es seleccionar columnas. Una cadena selecciona una sola columna como una serie y una lista de cadenas selecciona varias columnas como un DataFrame.

df['food']

Jane          Steak
Nick           Lamb
Aaron         Mango
Penelope      Apple
Dean         Cheese
Christina     Melon
Cornelia      Beans
Name: food, dtype: object

El uso de una lista selecciona varias columnas

df[['food', 'score']]

ingrese la descripción de la imagen aquí

Con lo que la gente está menos familiarizada es con que, cuando se usa la notación de sector, la selección se realiza por etiquetas de fila o por ubicación de números enteros. Esto es muy confuso y es algo que casi nunca uso, pero funciona.

df['Penelope':'Christina'] # slice rows by label

ingrese la descripción de la imagen aquí

df[2:6:2] # slice rows by integer location

ingrese la descripción de la imagen aquí

La explicidad de .loc/.iloc para seleccionar filas es muy preferido. El operador de indexación por sí solo no puede seleccionar filas y columnas simultáneamente.

df[3:5, 'color']
TypeError: unhashable type: 'slice'

Selección por .at y .iat

Selección con .at es casi idéntico a .loc pero solo selecciona una sola ‘celda’ en su DataFrame. Normalmente nos referimos a esta celda como un valor escalar. Usar .at, pásele una etiqueta de fila y columna separadas por una coma.

df.at['Christina', 'color']
'black'

Selección con .iat es casi idéntico a .iloc pero solo selecciona un único valor escalar. Debe pasarle un número entero para las ubicaciones de fila y columna

df.iat[2, 5]
'FL'

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *