Selección de datos en Pandas (loc / iloc / at)
La selección de datos es una de las operaciones más comunes en Pandas. Comprenderloc、iloc、atlas diferencias y los escenarios de aplicación te permitirán manejar los datos de manera más eficiente.
Diferencia entre loc e iloc
| Característica | loc | iloc |
|---|---|---|
| Método de indexación | Indexación por etiqueta (basada en etiquetas) | Indexación por posición (basada en enteros) |
| Slicing | Incluye la posición final | Excluye la posición final |
| Valor único | Devuelve un escalar | Devuelve un escalar |
| Escenario recomendado | Cuando hay etiquetas de índice explícitas | Cuando se selecciona por posición |
Ejemplo
# Crear un DataFrame de ejemplo
df = pd.DataFrame({
"Nombre": ["Zhang San", "Li Si", Wang Wu, "Zhao Liu", "Qian Qi"],
"Edad": [25, 30, 28, 35, 22],
"Ciudad": ["Pekín", Shanghái, "Guangzhou", "Shenzhen", "Hangzhou"]
}, index=[1, 3, 5, 7, 9]) # Nota: los índices no son continuos
print("DataFrame:")
print(df)
print()
# loc: usar índice por etiqueta (incluye la posición final)
print(df.loc[1:5] (rebanada por etiqueta, incluye 5):)
print(df.loc[1:5])
print()
# iloc: usar índice por posición (no incluye la posición final)
print(df.iloc[0:2] (rebanada por posición, no incluye 2):)
print(df.iloc[0:2])
Uso de loc
Seleccionar filas
Ejemplo
df = pd.DataFrame({
"Nombre": ["Zhang San", "Li Si", Wang Wu, "Zhao Liu"],
"Edad": [25, 30, 28, 35],
"Ciudad": ["Pekín", Shanghái, "Guangzhou", "Shenzhen"]
}, index=["a", "b", "c", "d"])
# Seleccionar una sola fila (devuelve una Serie)
print(Seleccionar una fila:)
print(df.loc["a"])
print()
# Seleccionar varias filas
print(Seleccionar varias filas:)
print(df.loc[["a", "c"]])
print()
# Selección por rebanada (incluye inicio y fin)
print(Selección por rebanada:)
print(df.loc["a":"c"])
Seleccionar columnas
Ejemplo
df = pd.DataFrame({
"Nombre": ["Zhang San", "Li Si", Wang Wu],
"Edad": [25, 30, 28],
"Ciudad": ["Pekín", Shanghái, "Guangzhou"]
}, index=["a", "b", "c"])
# Seleccionar una sola columna
print(Seleccionar una sola columna:)
print(df.loc[:, "Nombre"])
print()
# Seleccionar varias columnas
print(Seleccionar varias columnas:)
print(df.loc[:, ["Nombre", "Ciudad"]])
print()
# Seleccionar columnas por rebanada
print(Seleccionar columnas por rebanada:)
print(df.loc[:, "Nombre":"Ciudad"])
Seleccionar filas y columnas específicas (método recomendado)
Ejemplo
df = pd.DataFrame({
"Nombre": ["Zhang San", "Li Si", Wang Wu, "Zhao Liu"],
"Edad": [25, 30, 28, 35],
"Ciudad": ["Pekín", Shanghái, "Guangzhou", "Shenzhen"]
}, index=["a", "b", "c", "d"])
# Seleccionar filas y columnas específicas
print(Seleccionar un solo valor:)
print(df.loc["a", "Nombre"]) # Devuelve "张三"
print(type(df.loc["a", "Nombre"])) # El tipo es str
print()
# Seleccionar varias filas y columnas
print(Seleccionar subconjunto:)
print(df.loc[["a", "c"], ["Nombre", "Ciudad"]])
print()
# Selección condicional
print(Filas con edad mayor que 28:)
print(df.loc[df["Edad"] > 28])
Uso de iloc
Seleccionar por posición
Ejemplo
df = pd.DataFrame({
"Nombre": ["Zhang San", "Li Si", Wang Wu, "Zhao Liu"],
"Edad": [25, 30, 28, 35],
"Ciudad": ["Pekín", Shanghái, "Guangzhou", "Shenzhen"]
})
# Seleccionar la fila 0
print(Seleccionar la fila 0:)
print(df.iloc[0])
print()
# Seleccionar las primeras 3 filas
print(Seleccionar las primeras 3 filas:)
print(df.iloc[:3])
print()
# Seleccionar filas específicas
print(Seleccionar filas específicas:)
print(df.iloc[[0, 2, 3]])
print()
# Índices negativos (desde el final)
print(Seleccionar la última fila:)
print(df.iloc[-1])
print()
print(Seleccionar las últimas 3 filas:)
print(df.iloc[-3:])
Seleccionar columnas
Ejemplo
df = pd.DataFrame({
"Nombre": ["Zhang San", "Li Si", Wang Wu],
"Edad": [25, 30, 28],
"Ciudad": ["Pekín", Shanghái, "Guangzhou"]
})
# Seleccionar la columna 0
print(Columna 0:)
print(df.iloc[:, 0])
print()
# Seleccionar las columnas 1 y 2
print(Seleccionar varias columnas:)
print(df.iloc[:, [1, 2]])
print()
# Selección por rebanada
print(Seleccionar columnas por rebanada:)
print(df.iloc[:, 0:2])
at e iat (obtener un valor único)
atyiatson accesores especializados para obtener/establecer un solo valor, en comparación conlocyiloc>更快。
Ejemplo
import time
import numpy as np
# Crear un DataFrame grande para pruebas de rendimiento
df = pd.DataFrame(np.random.randn(1000, 10), columns=[f"col_{i}" for i in range(10)])
# at obtiene un solo valor (índice por etiqueta)
print(f"at: {df.at[0, 'col_0']}")
# iat obtiene un solo valor (índice por posición)
print(f"iat: {df.iat[0, 0]}")
# Comparación de rendimiento
n = 10000
start = time.time()
for _ in range(n):
_ = df.iloc[0, 0]
print(f"iloc tiempo transcurrido: {time.time() - start:.4f}s")
start = time.time()
for _ in range(n):
_ = df.iat[0, 0]
print(fDuración de iat: {time.time() - start:.4f}s)
Selección condicional
Usar condiciones booleanas para filtrar datos es una de las operaciones más comunes.
Ejemplo
df = pd.DataFrame({
"Nombre": ["Zhang San", "Li Si", Wang Wu, "Zhao Liu"],
"Edad": [25, 30, 28, 35],
"Ciudad": ["Pekín", Shanghái, "Guangzhou", "Pekín"],
"Salario": [12000, 15000, 11000, 18000]
})
# Condición única
print(Empleados con edad mayor que 28:)
print(df[df["Edad"] > 28])
print()
# Múltiples condiciones (usando & | ~)
print(Beijing y salario mayor que 12000:)
print(df[(df["Ciudad"] == "Pekín") & (df["Salario"] > 12000)])
print()
# Filtro con isin
print(La ciudad es Beijing o Shanghái:)
print(df[df["Ciudad"].isin(["Pekín", Shanghái])])
print()
# Coincidencia en cadena
print(El nombre contiene '三':)
print(df[df["Nombre"].str.contains("tres")])
Notas
1. El rebanado incluye la posición final
locel rebanado incluye la posición final,ilocno incluye.
2. Si el índice no existe, se produce un error
Al usarlocsi el índice no existe, se lanzará KeyError; se puede usarloc[index_list]junto conreindex。
3. Se recomienda usar preferentementeloc
porquelocMás legible y menos propenso a errores, a menos que sea necesario seleccionar por posición.
Otras extensiones
at/iatEs la forma más rápida de acceder a un solo valor,loc/ilocSe utiliza para seleccionar múltiples valores. Elegir el método adecuado puede mejorar el rendimiento y la legibilidad del código.