Tengo el siguiente DF:
id step1 step2 step3 step4 .... stepn-1, stepn, event 1 abc null null null 1 2 bdf null null null 0 3 adghlm 1Donde la identificación es una sesión, los pasos representan una ruta determinada y el evento es si sucedió algo específico
Quiero crear una tienda de funciones en la que tomemos todos los pasos posibles (a, b, c, ... hasta llegar a un número arbitrario) y convertirlos en columnas. Luego, quiero que la columna x siga siendo la id y solo complete un 1 o cero si esa sesión alcanzó ese paso en la columna. El resultado es el siguiente:
id abcdefg ... n event 1 1 1 1 0 0 0 0 0 1 2 0 1 0 0 0 1 0 0 0 3 1 0 0 1 0 0 1 1 1Tengo una lista única de todos los pasos posibles que supongo que se usarán para construir la nueva tabla. Pero después de eso estoy luchando pensando en cómo crear esto.
Lo que está buscando se usa a menudo en el aprendizaje automático y se denomina codificación one-hot .
Hay una función de pandas diseñada específicamente para este propósito, llamada pd.get_dummies() .
step_cols = [c for c in df.columns if c.startswith('step')] other_cols = [c for c in df.columns if not c.startswith('step')] new_df = pd.get_dummies(df[step_cols].stack()).groupby(level=0).max() new_df[other_cols] = df[other_cols]Producción:
>>> new_df abcdfghlm id event 0 1 1 1 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 0 0 2 0 2 1 0 0 1 0 1 1 1 1 3 1Probablemente no sea la forma más elegante:
step_cols = [col for col in df.columns if col.startswith("step")] values = pd.Series(sorted(set(df[step_cols].melt().value.dropna()))) df1 = pd.DataFrame( (values.isin(row).to_list() for row in zip(*(df[col] for col in step_cols))), columns=values ).astype(int) df = pd.concat([df.id, df1, df.event], axis=1)Resultado para
df = id step1 step2 step3 step4 event 0 1 abc NaN 1 1 2 bdf NaN 0 2 3 adgh 1es
id abcdfgh event 0 1 1 1 1 0 0 0 0 1 1 2 0 1 0 1 1 0 0 0 2 3 1 0 0 1 0 1 1 1