Series y DataFrames de pandas
pandas añade ejes etiquetados a los datos de columnas: una Series es una columna tipada; un DataFrame es una tabla de Series alineadas que comparten un índice.
Receta
Tarjeta de referencia rápida - lista para copiar y pegar.
import pandas as pd
df = pd.DataFrame(
{"region": ["East", "West"], "revenue": [120, 340]},
index=pd.Index(["a", "b"], name="row"),
)
east = df.loc[df["region"] == "East", "revenue"]
subset = df.iloc[0:1, [0, 1]]Cuándo recurrir a esto:
- EDA tabular con tipos de columna mixtos y valores faltantes
- Series temporales etiquetadas indexadas por marcas de tiempo
- Unión de múltiples tablas por claves antes de la agregación
- Exportación de resultados de análisis a CSV, Parquet o Excel
Ejemplo de Trabajo
import pandas as pd
orders = pd.DataFrame(
{
"order_id": [101, 102, 103, 104],
"region": pd.Categorical(["East", "West", "East", "West"]),
"revenue": [120.0, 340.0, None, 210.0],
"ordered_at": pd.to_datetime(
["2025-01-01", "2025-01-02", "2025-01-03", "2025-01-04"], utc=True
),
}
).set_index("order_id")
# Selección basada en etiquetas
east = orders.loc[orders["region"] == "East", ["region", "revenue"]]
# Cabecera basada en posición
head = orders.iloc[:2]
# Añadir columna calculada de forma segura
orders = orders.copy()
orders["revenue_filled"] = orders["revenue"].fillna(orders["revenue"].median())
# Reducción de Series
monthly_total = orders["revenue_filled"].sum()
print(east)
print("monthly_total:", monthly_total)Lo que esto demuestra:
- Construcción con columnas categóricas y flotantes anulables
- Análisis de fecha y hora UTC al cargar
- Filtrado booleano
.loccon subconjunto de columnas .copy()antes de la asignación para evitar SettingWithCopyWarning
Inmersión Profunda
Cómo Funciona
- Las etiquetas del índice alinean las filas entre columnas: las operaciones coinciden automáticamente en el índice.
- El gestor de bloques (pandas 2.x) almacena las columnas en bloques basados en Arrow/numpy por dtype.
.locincluye ambos extremos para las etiquetas;.iloces semiabierto como los slices de Python.- El backend de
dtype(string[pyarrow]) cambia el comportamiento de la memoria y los valores faltantes.
Hoja de Trucos de Selección
| Objetivo | API |
|---|---|
| Filtrar filas | df.loc[mask] |
| Elegir columnas | df[["a", "b"]] |
| Escalar por etiqueta | df.loc[row, "col"] |
| Escalar por posición | df.iloc[i, j] |
Parámetros y Valores de Retorno
| Parámetro | Tipo | Descripción |
|---|---|---|
index | Similar a Index | Etiquetas de fila; por defecto es RangeIndex |
columns | list[str] | Nombres de columna para DataFrame |
dtype | str/np.dtype | Fuerza el tipo de columna en la construcción |
Trampas Comunes
- Asignación de indexación encadenada -
df[df["x"] > 0]["y"] = 1activa SettingWithCopyWarning. Solución:df.loc[df["x"] > 0, "y"] = 1. - Etiquetas de índice duplicadas -
.loc["a"]devuelve múltiples filas; el acceso escalar falla. Solución:reset_index()o forzar claves únicas aguas arriba. - Cadenas de tipo object - las columnas
objectpor defecto usan mucha RAM. Solución:df["col"] = df["col"].astype("string[pyarrow]")en pandas 2.2+. - Coerción silenciosa de dtype - mezclar enteros y flotantes actualiza la columna a flotante. Solución: usar
Int64anulable cuando sea posible NA. - Naive vs. aware de zona horaria - comparar marcas de tiempo mixtas da error en pandas 2.x. Solución:
pd.to_datetime(..., utc=True)en todas partes al ingerir.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Polars DataFrame | Escaneos perezosos, datos muy grandes, tipado estricto | El equipo ya está estandarizado en los modismos de pandas |
| PyArrow Table | Intercambio de memoria cero entre sistemas | Necesitas indexación interactiva rica |
| SQL vía DuckDB | Los datos ya están en tablas de almacén | Transformaciones pequeñas en memoria |
| Arrays estructurados de NumPy | Registros numéricos de esquema fijo | Tipos de columna heterogéneos |
Preguntas Frecuentes
¿Cuándo debo usar reset_index?
- Después de
groupbycuando necesitas la clave del grupo como una columna. - Cuando las etiquetas de índice duplicadas rompen el acceso escalar
.loc.
¿Cuál es la diferencia entre [] y .loc?
df["col"]selecciona una Series de una columna.df.loc[rows, cols]es una selección 2D basada en etiquetas con reglas de alineación.
¿Cómo evito copias al filtrar?
- Filtrar siempre devuelve un nuevo marco a menos que uses
inplace=True(desaconsejado). - Para datos enormes, usa el filtro perezoso
filterde Polars o lecturas por fragmentos.
¿Cómo leo solo algunas columnas de un CSV?
import pandas as pd
df = pd.read_csv("big.csv", usecols=["region", "revenue"])¿Puede una Series tener un nombre?
- Sí -
s.nameaparece cuando la Series se convierte en una columna de DataFrame. - Se establece en la creación:
pd.Series(..., name="revenue").
¿Cómo detecto nombres de columna duplicados?
import pandas as pd
df.columns.duplicated().any()- Los nombres duplicados hacen que
df["x"]devuelva múltiples columnas.
¿Qué hace copy-on-write en pandas 2.x?
- Con
pd.options.mode.copy_on_write = True, las operaciones encadenadas posponen las copias hasta la escritura. - Prefiere aún la asignación explícita
.locpara mayor claridad.
¿Cómo convierto el índice en columna?
df = df.reset_index()- O
df.rename_axis("order_id").reset_index()para nombrar el índice anterior.
¿Por qué mi columna numérica tiene dtype object?
- Las cadenas y números mixtos fuerzan el tipo object.
- Relee con
dtypeopd.to_numeric(errors="coerce").
¿Cómo muestreo filas de forma reproducible?
sample = df.sample(n=100, random_state=42)Relacionado
- Limpieza y Transformación de Datos - dtypes y valores faltantes
- GroupBy y Agregación - dividir-aplicar-combinar
- Uniones y Mezclas - combinación de marcos
- Conceptos Básicos de Análisis de Datos - recorrido introductorio
Versiones de la Pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.