Agregar una columna nunique agregada agrupada al dataframe de pandas

Quiero agregar una columna agregada, agrupada, nunique a mi dataframe de pandas, pero no agregar todo el dataframe. Estoy tratando de hacer esto en una línea y evitar crear un nuevo objeto agregado y fusionarlo, etc.

mi df tiene pista, tipo e id. Quiero el número de identificadores únicos para cada combinación de pista / tipo como una nueva columna en la tabla (pero no contraer las combinaciones de pista / tipo en el df resultante). Mismo número de filas, 1 columna más.

algo como esto no está funcionando:

df['n_unique_id'] = df.groupby(['track', 'type'])['id'].nunique() 

ni es

 df['n_unique_id'] = df.groupby(['track', 'type'])['id'].transform(nunique) 

este último funciona con algunas funciones de agregación pero no con otras. los siguientes trabajos (pero no tiene sentido en mi conjunto de datos):

 df['n_unique_id'] = df.groupby(['track', 'type'])['id'].transform(sum) 

en R esto se hace fácilmente en data.table con

 df[, n_unique_id := uniqueN(id), by = c('track', 'type')] 

¡Gracias!

 df.groupby(['track', 'type'])['id'].transform(nunique) 

Implica que hay un nombre nunique en el espacio de nombres que realiza alguna función. transform tomará una función o una cadena para la que conoce una función. nunique es definitivamente una de esas cadenas.

Como lo señaló @root, a menudo el método que los pandas utilizarán para realizar una transformación indicada por estas cadenas está optimizado y generalmente se debería preferir a pasar sus propias funciones. Esto es True incluso para pasar funciones numpy en algunos casos.

Por ejemplo, la transform('sum') debe preferirse a la transform(sum) .

Prueba esto en su lugar

 df.groupby(['track', 'type'])['id'].transform('nunique') 

manifestación

 df = pd.DataFrame(dict( track=list('11112222'), type=list('AAAABBBB'), id=list('XXYZWWWW'))) print(df) id track type 0 X 1 A 1 X 1 A 2 Y 1 A 3 Z 1 A 4 W 2 B 5 W 2 B 6 W 2 B 7 W 2 B df.groupby(['track', 'type'])['id'].transform('nunique') 0 3 1 3 2 3 3 3 4 1 5 1 6 1 7 1 Name: id, dtype: int64