Tengo un CSV que estoy leyendo en un dataframe de pandas. Sin embargo, una de las columnas tiene la forma de un diccionario. Aquí hay un ejemplo:
ColA, ColB, ColC, ColdD 20, 30, {"ab":"1", "we":"2", "as":"3"},"String"
¿Cómo puedo convertir esto en un dataframe que se parece a esto:
ColA, ColB, AB, WE, AS, ColdD 20, 30, "1", "2", "3", "String"
edit He solucionado la pregunta, se ve así, pero es una cadena que necesita ser analizada, no un objeto dict.
Así que comenzando con su una fila df
Col A Col B Col C Col D 0 20 30 {u'we': 2, u'ab': 1, u'as': 3} String1
EDIT: basado en el comentario del OP, asumo que primero debemos convertir la cadena
import ast df["ColC"] = df["ColC"].map(lambda d : ast.literal_eval(d))
luego convertimos Col C en un dict, lo transponemos y luego lo unimos al df original
dfNew = df.join(pd.DataFrame(df["Col C"].to_dict()).T) dfNew
lo que te da esto
Col A Col B Col C Col D ab as we 0 20 30 {u'we': 2, u'ab': 1, u'as': 3} String1 1 3 2
Luego simplemente seleccionamos las columnas que queremos en dfNew
dfNew[["Col A", "Col B", "ab", "we", "as", "Col D"]] Col A Col B ab we as Col D 0 20 30 1 2 3 String1
Según https://stackoverflow.com/a/38231651/454773 , puede usar .apply(pd.Series)
para asignar la columna que contiene el dict sobre nuevas columnas y luego concatenar estas nuevas columnas de nuevo en el dataframe original menos el dict original columna que contiene:
dw=pd.DataFrame( [[20, 30, {"ab":"1", "we":"2", "as":"3"},"String"]], columns=['ColA', 'ColB', 'ColC', 'ColdD']) pd.concat([dw.drop(['ColC'], axis=1), dw['ColC'].apply(pd.Series)], axis=1)
Devoluciones:
ColA ColB ColdD ab as we 20 30 String 1 3 2
¿Qué pasa con algo como:
import pandas as pd # Create mock dataframe df = pd.DataFrame([ [20, 30, {'ab':1, 'we':2, 'as':3}, 'String1'], [21, 31, {'ab':4, 'we':5, 'as':6}, 'String2'], [22, 32, {'ab':7, 'we':8, 'as':9}, 'String2'], ], columns=['Col A', 'Col B', 'Col C', 'Col D']) # Create dataframe where you'll store the dictionary values ddf = pd.DataFrame(columns=['AB','WE','AS']) # Populate ddf dataframe for (i,r) in df.iterrows(): e = r['Col C'] ddf.loc[i] = [e['ab'], e['we'], e['as']] # Replace df with the output of concat(df, ddf) df = pd.concat([df, ddf], axis=1) # New column order, also drops old Col C column df = df[['Col A', 'Col B', 'AB', 'WE', 'AS', 'Col D']] print(df)
Salida:
Col A Col B AB NOSOTROS COMO Col D 0 20 30 1 2 3 Cuerda1 1 21 31 4 5 6 cuerdas2 2 22 32 7 8 9 Cuerda2