Tengo un marco de datos de pandas (X11) como este: en realidad tengo 99 columnas hasta dx99
dx1 dx2 dx3 dx4
0 25041 40391 5856 0
1 25041 40391 25081 5856
2 25041 40391 42822 0
3 25061 40391 0 0
4 25041 40391 0 5856
5 40391 25002 5856 3569
Quiero crear columnas adicionales para valores de celda como 25041,40391,5856, etc. Entonces habrá una columna 25041 con un valor de 1 o 0 si 25041 aparece en esa fila en particular en cualquier columna dxs. Estoy usando este código y funciona cuando el número de filas es menor.
mat = X11.as_matrix(columns=None)
values, counts = np.unique(mat.astype(str), return_counts=True)
for x in values:
X11[x] = X11.isin([x]).any(1).astype(int)
Estoy obteniendo un resultado como este:
dx1 dx2 dx3 dx4 0 25002 25041 25061 25081 3569 40391 42822 5856
25041 40391 5856 0 0 0 1 0 0 0 1 0 1
25041 40391 25081 5856 0 0 1 0 1 0 1 0 1
25041 40391 42822 0 0 0 1 0 0 0 1 1 0
25061 40391 0 0 0 0 0 1 0 0 1 0 0
25041 40391 0 5856 0 0 1 0 0 0 1 0 1
40391 25002 5856 3569 0 1 0 0 0 1 1 0 1
Cuando el número de filas es de muchos miles o millones, se cuelga y tarda una eternidad y no obtengo ningún resultado. Observe que los valores de las celdas no son exclusivos de la columna, sino que se repiten en varias columnas. Por ejemplo, 40391 está ocurriendo en dx1 así como en dx2 y así sucesivamente para 0 y 5856, etc. ¿Alguna idea de cómo mejorar la lógica mencionada anteriormente?
fuente
Respuestas:
Hay una solución mucho más pitónica en los pandas ...
Esto toma menos de un segundo en 10 millones de filas en mi computadora portátil:
Aquí están los detalles establecidos:
Marco de datos pequeño y simple:
Método de binarización
Marco de datos con 10 millones de filas:
Binarización cronometrada (también conocida como codificación de uno en caliente) en el marco de datos de 10 millones de filas:
¡Espero que esto ayude!
fuente
Parece que desea crear una variable ficticia a partir de una columna de marco de datos de pandas. Afortunadamente, los pandas tiene un método especial para ello:
get_dummies()
. Aquí hay un fragmento de código que puede adaptar a sus necesidades:Aquí está la salida de
data_transformed
:fuente