¿Cómo añadir una columna a un DataFrame en pandas?
Respuesta corta: asigna los valores a un nombre nuevo entre corchetes: df["nueva"] = valores. Los valores pueden ser una lista con un valor por fila, un único valor para todas las filas o un cálculo con otras columnas.
import pandas as pd
df = pd.DataFrame({
"producto": ["Café", "Té", "Agua"],
"precio": [2.5, 2.0, 1.0],
"unidades": [10, 4, 20],
})
df["total"] = df["precio"] * df["unidades"]
print(df) producto precio unidades total
0 Café 2.5 10 25.0
1 Té 2.0 4 8.0
2 Agua 1.0 20 20.0La columna nueva se añade al final. Si el nombre ya existe, pandas reemplaza sus valores en lugar de crear otra columna.
Corchetes para lo habitual, insert() para elegir la posición y assign() para encadenar.
3 formas de añadir una columna en pandas
| Forma | Ejemplo | Dónde la pone | Cambia df |
|---|---|---|---|
| Corchetes | df["total"] = df["precio"] * df["unidades"] | Al final | Sí |
insert() | df.insert(1, "codigo", ["C01", "T01", "A01"]) | En la posición que elijas | Sí |
assign() | df = df.assign(total=df["precio"] * df["unidades"]) | Al final | No, devuelve un DataFrame nuevo |
1. Con corchetes
Es la forma más usada. Funciona con una lista, con un valor fijo o con un cálculo:
df["stock"] = [5, 0, 12] # un valor por fila
df["moneda"] = "EUR" # el mismo valor en todasLa lista tiene que tener exactamente tantos valores como filas tiene el DataFrame.
2. En una posición concreta con insert()
df.insert(1, "codigo", ["C01", "T01", "A01"])
print(df[["producto", "codigo", "precio"]]) producto codigo precio
0 Café C01 2.5
1 Té T01 2.0
2 Agua A01 1.0El primer argumento es la posición: 0 la pone la primera. insert() da error si la columna ya existe.
3. Varias columnas a la vez con assign()
resumen = df.assign(
total=df["precio"] * df["unidades"],
iva=lambda x: x["total"] * 0.21,
)
print(resumen[["producto", "total", "iva"]]) producto total iva
0 Café 25.0 5.25
1 Té 8.0 1.68
2 Agua 20.0 4.20assign() no cambia df, devuelve uno nuevo. Con lambda puedes usar columnas creadas en el mismo assign(), como iva usa total.
Ejemplos de columnas calculadas en pandas
Con una condición
import numpy as np
df["tipo"] = np.where(df["precio"] > 1.5, "premium", "básico")np.where() elige un valor si se cumple la condición y otro si no. Para un simple sí o no, basta con df["caro"] = df["precio"] > 1.5, que crea una columna de True y False.
Rellenar solo algunas filas
df.loc[df["stock"] == 0, "aviso"] = "agotado"Las filas que no cumplen la condición quedan con NaN.
A partir de un diccionario
categorias = {"Café": "caliente", "Té": "caliente", "Agua": "fría"}
df["categoria"] = df["producto"].map(categorias)Por rangos de valores
df["nivel"] = pd.cut(df["unidades"], bins=[0, 5, 15, 100], labels=["bajo", "medio", "alto"])
print(df[["unidades", "nivel"]]) unidades nivel
0 10 medio
1 4 bajo
2 20 altoUniendo textos de otras columnas
df["nombre_largo"] = df["producto"] + " (" + df["tipo"] + ")"Con una función propia
df["etiqueta"] = df["producto"].apply(lambda p: p.upper())apply() sirve para cualquier lógica, pero es más lento que las operaciones con columnas enteras. Para pasar a mayúsculas, df["producto"].str.upper() hace lo mismo y es más rápido.
