En pandas, el promedio de una columna se obtiene con df["columna"].mean(). Para el promedio de cada columna numérica usa df.mean(numeric_only=True) y para el de cada fila, df[columnas].mean(axis=1). Los valores faltantes (NaN) se ignoran por omisión; si la columna está guardada como texto, conviértela antes con pd.to_numeric.
Sintaxis
df["col"].mean() # una columna → un número
df.mean(numeric_only=True) # cada columna numérica → Serie
df[["a", "b", "c"]].mean(axis=1) # cada fila → Serie
df.loc[condicion, "col"].mean() # solo las filas que cumplen
df["col"].mean(skipna=False) # nan si falta algún dato
Paso a paso
- Carga los datos:
df = pd.read_csv("archivo.csv"). Si el archivo usa coma decimal, agregadecimal=","(ysep=";"si las columnas se separan con punto y coma, como en los CSV que exporta Excel en España). - Revisa los tipos con
df.dtypes: las columnas a promediar deben serint64ofloat64, noobject. - Elige la dirección: una columna, todas las columnas o cada fila.
- Guarda el resultado en una variable o en una columna nueva y redondea con
.round(2)al final.
Ejemplos resueltos
Ejemplo 1: promedio de cada parcial y de cada alumno
import pandas as pd
df = pd.DataFrame({
"alumno": ["Ana", "Luis", "Sofía", "Diego"],
"parcial1": [8.5, 6.0, 9.0, 7.5],
"parcial2": [9.0, 7.0, 8.5, 6.5],
"parcial3": [7.5, 8.0, 10.0, 7.0],
})
print(df["parcial1"].mean())
print(df.mean(numeric_only=True))
7.75
parcial1 7.750
parcial2 7.750
parcial3 8.125
dtype: float64
Para el promedio de cada alumno, promedia a lo ancho de las tres columnas con axis=1 y guárdalo como columna nueva:
df["promedio"] = df[["parcial1", "parcial2", "parcial3"]].mean(axis=1).round(2)
print(df)
alumno parcial1 parcial2 parcial3 promedio
0 Ana 8.5 9.0 7.5 8.33
1 Luis 6.0 7.0 8.0 7.00
2 Sofía 9.0 8.5 10.0 9.17
3 Diego 7.5 6.5 7.0 7.00
Elegir las columnas explícitamente evita que una columna de texto (el nombre) o una de identificadores numéricos (la matrícula) entre al promedio.
Ejemplo 2: promedio con condición
Con el mismo df, la media del segundo parcial solo de quienes sacaron más de 7 en el primero, y la lista de alumnos con promedio de 8 o más:
print(df.loc[df["parcial1"] > 7, "parcial2"].mean())
print(df[df["promedio"] >= 8]["alumno"].tolist())
8.0
['Ana', 'Sofía']
Ana, Sofía y Diego superan el 7 en el primer parcial; sus segundos parciales (9.0, 8.5 y 6.5) promedian 8.0. Es el equivalente de PROMEDIO.SI en Excel.
Ejemplo 3: columna numérica leída como texto
s = pd.Series(["8", "9", "7"])
print(pd.to_numeric(s).mean())
8.0
Sin la conversión, s.mean() lanza TypeError: Could not convert string '897' to numeric: pandas intentó sumar los textos, los concatenó en «897» y luego no pudo dividir. Si algunos valores no son convertibles, usa pd.to_numeric(s, errors="coerce").
Errores comunes
TypeError: Could not convert ['AnaLuisSofíaDiego'] to numeric. Llamastedf.mean()sobre una tabla con columnas de texto. Desde pandas 2.0,numeric_onlyvaleFalsepor omisión; pásalo comoTrueo selecciona las columnas.- Usar
axis=0cuando querías filas.axis=0(por omisión) da un promedio por columna;axis=1, uno por fila. - Contar faltantes como ceros sin querer.
mean()ignoraNaN. Si un parcial no presentado vale 0, rellena antes confillna(0). - Promediar promedios. El promedio de los promedios de cada alumno es igual al promedio general solo si todos tienen la misma cantidad de calificaciones.
SettingWithCopyWarningal crear la columna. Aparece sidfes un recorte de otra tabla; crea una copia con.copy()antes de agregar columnas.
Para promediar por categoría (región, grupo, mes) en lugar de por columna, mira promedio por grupo con groupby. Si quieres la versión escolar del cálculo, sin código, está en cómo sacar el promedio de calificaciones.
Fuentes
- pandas, DataFrame.mean. Parámetros axis, skipna y numeric_only. Consultado el 11 de noviembre de 2026.