Python divide las columnas del dataframe en varias filas

Tengo un dataframe como este:

-------------------------------------------------------------------- Product ProductType SKU Size -------------------------------------------------------------------- T-shirt Top [111,222,333,444] ['XS','S','M','L'] Pant(Flared) Bottoms [555,666] ['M','L'] Sweater Top None None 

Quiero la siguiente salida:

 Product ProductType SKU Size T-shirt Top 111 XS T-shirt Top 222 S T-shirt Top 333 M T-shirt Top 444 L Pant(Flared) Bottoms 555 M Pant(Flared) Bottoms 666 L Sweater Top None None 

Probé el siguiente código:

 s = df['SKU'].apply(Series,1).stack() s.index = s.index.droplevel(-1) s.name = 'SKU' del df['SKU'] df = df.join(s) r = df['Size'].apply(Series,1).stack() r.index = r.index.droplevel(-1) r.name = 'Size' del df['Size'] df = df.join(r) 

Pero esto explota en lo siguiente:

 Product ProductType SKU Size T-shirt Top 111 XS T-shirt Top 111 S T-shirt Top 111 M T-shirt Top 111 L T-shirt Top 222 XS T-shirt Top 222 S T-shirt Top 222 M T-shirt Top 222 L T-shirt Top 333 XS T-shirt Top 333 S T-shirt Top 333 M T-shirt Top 333 L T-shirt Top 444 XS T-shirt Top 444 S T-shirt Top 444 M T-shirt Top 444 L Pant(Flared) Bottoms 555 M Pant(Flared) Bottoms 555 L Pant(Flared) Bottoms 666 M Pant(Flared) Bottoms 666 L 

Tenga en cuenta que para simplificar, he agregado dos columnas que se repetirán (Producto, Tipo de producto) pero tengo 5 columnas que contienen cadenas. Básicamente quiero asociar el SKU con el tamaño de cada producto.

¿Alguien puede ayudar aquí?

Esto está abierto a errores, así que utilícelo con precaución:

Convierta la columna Producto en una colección de listas cuyos tamaños sean iguales a los de otras columnas (por ejemplo, SKU de columna. Esto no funcionará si las listas en SKU y Tamaño tienen diferentes longitudes)

 df["Product"] = df["Product"].map(list) * df["SKU"].map(len) Out[184]: SKU Size Product 0 [111, 222, 333, 444] [XS, S, M, L] [a, a, a, a] 1 [555, 666] [M, L] [b, b] 

Tome la sum de las columnas (ampliará las listas) y pásela al constructor del dataframe con to_dict() :

 pd.DataFrame(df.sum().to_dict()) Out[185]: Product SKU Size 0 a 111 XS 1 a 222 S 2 a 333 M 3 a 444 L 4 b 555 M 5 b 666 L 

Editar :

Para varias columnas, puede definir las columnas a repetir:

 cols_to_be_repeated = ["Product", "ProductType"] 

Guarde las filas que tienen valores Ninguno en otro dataframe:

 na_df = df[pd.isnull(df["SKU"])].copy() 

No suelte ninguno del dataframe original:

 df.dropna(inplace = True) 

Iterar sobre esas columnas:

 for col in cols_to_be_repeated: df[col] = df[col].map(lambda x: [x]) * df["SKU"].map(len) 

Y usa el mismo enfoque:

 pd.concat([pd.DataFrame(df.sum().to_dict()), na_df]) Product ProductType SKU Size 0 T-shirt Top 111.0 XS 1 T-shirt Top 222.0 S 2 T-shirt Top 333.0 M 3 T-shirt Top 444.0 L 4 Pant(Flared) Bottoms 555.0 M 5 Pant(Flared) Bottoms 666.0 L 2 Sweater Top NaN None 

Podría ser mejor trabajar en una copia del dataframe original.