HOWTO · Pandas
Explotar varias columnas en Pandas
Este tutorial explica cómo explotar múltiples columnas en Pandas.
En esta página
Cuando varias columnas de un pandas DataFrame contienen listas, puedes expandir sus elementos en filas con DataFrame.explode(). Al expandir varias columnas a la vez, los elementos se alinean por posición, de modo que cada fila resultante mantiene juntos los valores relacionados. Usa este método cuando las listas de una fila contengan valores correspondientes, como nombres de productos y cantidades.
Qué hace DataFrame.explode()
DataFrame.explode() convierte cada elemento de una celda que contiene una lista o estructura similar en una fila independiente. Los valores de las demás columnas se repiten en esas filas y, de forma predeterminada, también se repite la etiqueta del índice original. El método devuelve un DataFrame nuevo; no modifica el DataFrame de origen, a menos que asignes el resultado.
Por ejemplo, al expandir una columna que contiene [["pear", "plum"], ["fig"]] se obtienen tres filas. La fila con "pear" y "plum" genera dos filas, mientras que la fila con "fig" genera una. Este comportamiento facilita filtrar, agrupar o combinar valores anidados.
Expandir varias columnas con DataFrame.explode()
Pasa los nombres de las columnas como una lista al método DataFrame.explode(). pandas expande las columnas seleccionadas en paralelo: los primeros valores permanecen juntos, al igual que los segundos, y así sucesivamente. En este caso, cada producto queda emparejado con su cantidad.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import pandas as pd
orders = pd.DataFrame(
{
"order": ["A", "B"],
"product": [["pear", "plum"], ["fig", "lime"]],
"quantity": [[2, 3], [1, 4]],
}
)
print(orders.explode(["product", "quantity"], ignore_index=True))
El resultado contiene una fila por producto, con su cantidad correspondiente y el valor del pedido. Si solo expandes product, cada lista original de quantity se repetiría intacta; al seleccionar ambas columnas, cada par se expande en conjunto. Los nombres de las columnas seleccionadas deben corresponder a columnas distintas del DataFrame.
Entender los índices y ignore_index
De forma predeterminada, el resultado conserva el índice de origen, por lo que una etiqueta aparece una vez por cada fila creada a partir de la fila original. Esto puede ayudar a relacionar las filas del resultado con sus datos de origen. Establece ignore_index=True si prefieres un índice secuencial nuevo. Esta opción cambia las etiquetas del índice del resultado, pero no los datos ni el orden de las filas expandidas.
El ejemplo anterior con varias columnas usa ignore_index=True; omite ese argumento para conservar las etiquetas originales. También puedes elegir cualquiera de las dos opciones al expandir una sola columna:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import pandas as pd
items = pd.DataFrame({"group": ["north", "south"], "item": [["a", "b"], ["c"]]}, index=[10, 20])
print(items.explode("item"))
print(items.explode("item", ignore_index=True))
Elige la opción según lo que necesites en los pasos posteriores. Si el índice contiene información significativa, consérvalo o copia ese identificador en una columna normal antes de restablecer el índice. Si solo sirve como etiqueta de fila, ignore_index=True crea una secuencia sencilla para el resultado expandido.
Gestionar listas de longitudes distintas
Al expandir varias columnas a la vez, los valores de tipo lista seleccionados deben tener la misma longitud en cada fila. Por ejemplo, no se pueden alinear por posición dos productos con una sola cantidad. pandas genera un ValueError para esa fila en lugar de adivinar cómo emparejar los valores.
Revisa los datos de origen y decide cómo representar las correspondencias ausentes antes de expandir. Según el caso, puedes corregir las listas, añadir un valor ausente explícito para la correspondencia que falta o procesar las columnas por separado si sus datos no están alineados. No expandas las columnas por separado cuando los valores deban permanecer emparejados: hacerlo puede generar combinaciones que no existen en los datos de origen.
Usar Series.explode() con apply() como alternativa
También puedes establecer un identificador de fila como índice, aplicar Series.explode() a cada Series seleccionada y después restaurar el identificador como columna. Este patrón puede resultar práctico si quieres aplicar una operación de Series columna por columna. Las longitudes de las listas deben seguir coincidiendo en cada fila; este método no permite procesar longitudes distintas.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import pandas as pd
orders = pd.DataFrame(
{
"order": ["A", "B"],
"product": [["pear", "plum"], ["fig", "lime"]],
"quantity": [[2, 3], [1, 4]],
}
)
expanded = orders.set_index("order").apply(pd.Series.explode).reset_index()
print(expanded)
Con estos datos, ambos métodos producen filas alineadas de productos y cantidades. Prefiere DataFrame.explode() si quieres indicar directamente las columnas que se expandirán; usa el patrón de Series.explode() con apply() si aplicar el método de Series a las columnas seleccionadas encaja mejor con el código que lo rodea.