pandas proporciona dos formas de crear histogramas: plot.hist, que dibuja todas las columnas en el mismo gráfico, y hist, que crea una cuadrícula con un histograma por columna.
plot.hist
Llama a plot.hist sobre una Series para dibujar su histograma. El argumento bins establece el número de intervalos (10 por defecto).
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
rng = np.random.default_rng(5)
df = pd.DataFrame({"matematicas": rng.normal(65, 12, 300).clip(0, 100),
"fisica": rng.normal(55, 15, 300).clip(0, 100),
"colegio": rng.choice(["Norte", "Sur", "Este"], 300)})
df["matematicas"].plot.hist(bins = 20, edgecolor = "white")
# plt.show()

Sobre un data frame, plot.hist dibuja un histograma por columna en el mismo gráfico. Establece cierta transparencia con alpha para que todos sean visibles, o apílalos con stacked = True.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
rng = np.random.default_rng(5)
df = pd.DataFrame({"matematicas": rng.normal(65, 12, 300).clip(0, 100),
"fisica": rng.normal(55, 15, 300).clip(0, 100),
"colegio": rng.choice(["Norte", "Sur", "Este"], 300)})
df[["matematicas", "fisica"]].plot.hist(bins = 20, alpha = 0.5)
# plt.show()

Histograma apilado
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
rng = np.random.default_rng(5)
df = pd.DataFrame({"matematicas": rng.normal(65, 12, 300).clip(0, 100),
"fisica": rng.normal(55, 15, 300).clip(0, 100),
"colegio": rng.choice(["Norte", "Sur", "Este"], 300)})
df[["matematicas", "fisica"]].plot.hist(bins = 20, stacked = True)
# plt.show()

hist
El método hist crea una cuadrícula de subplots con el histograma de cada columna numérica.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
rng = np.random.default_rng(5)
df = pd.DataFrame({"matematicas": rng.normal(65, 12, 300).clip(0, 100),
"fisica": rng.normal(55, 15, 300).clip(0, 100),
"colegio": rng.choice(["Norte", "Sur", "Este"], 300)})
df.hist(bins = 20, figsize = (8, 3.5))
# plt.show()
El argumento by de hist crea un histograma para cada grupo de una variable categórica.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
rng = np.random.default_rng(5)
df = pd.DataFrame({"matematicas": rng.normal(65, 12, 300).clip(0, 100),
"fisica": rng.normal(55, 15, 300).clip(0, 100),
"colegio": rng.choice(["Norte", "Sur", "Este"], 300)})
df.hist(column = "matematicas", by = "colegio", bins = 15, layout = (1, 3),
sharex = True, figsize = (8, 3))
# plt.show()
Utiliza density = True para mostrar el histograma en proporciones y agrega la estimación de densidad kernel con plot.kde sobre los mismos ejes.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
rng = np.random.default_rng(5)
df = pd.DataFrame({"matematicas": rng.normal(65, 12, 300).clip(0, 100),
"fisica": rng.normal(55, 15, 300).clip(0, 100),
"colegio": rng.choice(["Norte", "Sur", "Este"], 300)})
ax = df["matematicas"].plot.hist(bins = 20, density = True, alpha = 0.5)
df["matematicas"].plot.kde(ax = ax)
# plt.show()

Consulta también cómo crear un histograma en matplotlib o en seaborn y la guía sobre gráficos con pandas.
También te puede interesar