Estoy buscando agregar un uuid para cada fila en una sola columna nueva en un DataFrame de pandas. Esto obviamente llena la columna con el mismo uuid:
import uuid import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(4,3), columns=list('abc'), index=['apple', 'banana', 'cherry', 'date']) df['uuid'] = uuid.uuid4() print(df) abc uuid apple 0.687601 -1.332904 -0.166018 34115445-c4b8-4e64-bc96-e120abda1653 banana -2.252191 -0.844470 0.384140 34115445-c4b8-4e64-bc96-e120abda1653 cherry -0.470388 0.642342 0.692454 34115445-c4b8-4e64-bc96-e120abda1653 date -0.943255 1.450051 -0.296499 34115445-c4b8-4e64-bc96-e120abda1653Lo que estoy buscando es un nuevo uuid en cada fila de la columna 'uuid'. También intenté usar .apply() y .map() sin éxito.
Esta es una manera:
df['uuid'] = [uuid.uuid4() for _ in range(len(df.index))]No puedo hablar de eficiencia computacional aquí, pero prefiero la sintaxis aquí, ya que es consistente con las otras modificaciones de apply-lambda que suelo usar para generar nuevas columnas:
df['uuid'] = df.apply(lambda _: uuid.uuid4(), axis=1) También puede elegir una columna aleatoria para eliminar el requisito del eje (por qué el axis=0 es el valor predeterminado, nunca lo entenderé):
df['uuid'] = df['col'].apply(lambda _: uuid.uuid4()) La desventaja de esto es técnicamente que está pasando una variable ( _ ) que en realidad no usa. Sería agradable tener la capacidad de hacer algo como lambda: uuid.uuid4() , pero apply no admite lambas sin argumentos, lo cual es razonable dado que su caso de uso sería bastante limitado.
from uuid import uuid4 df['uuid'] = df.index.to_series().map(lambda x: uuid4())