Tengo un dataframe que tiene una de las columnas como un diccionario. Quiero descomprimirlo en varias columnas (es decir, el código, la cantidad son columnas separadas en el siguiente formato de columna Sin formato). El siguiente código solía trabajar con pandas v0.22, ahora (0.23) dando un error de índice:
pd.DataFrame.from_records(df.col_name.fillna(pd.Series([{'code':'not applicable'}], index=df.index)).values.tolist()) ValueError: Length of passed values is 1, index implies x
Busqué en google / stack overflow por horas y ya no funcionaba ninguna de las otras soluciones presentadas anteriormente.
Formato de columna sin formato:
dict_codes 0 {'code': 'xx', 'amount': '10.00',... 1 {'code': 'yy', 'amount': '20.00'... 2 {'code': 'bb', 'amount': '30.00'... 3 {'code': 'aa', 'amount': '40.00'... 10 {'code': 'zz', 'amount': '50.00'... 11 NaN 12 NaN 13 NaN
¿Alguien tiene alguna sugerencia?
Gracias
df = pd.DataFrame(dict( codes=[ {'amount': 12, 'code': 'a'}, {'amount': 19, 'code': 'x'}, {'amount': 37, 'code': 'm'}, np.nan, np.nan, np.nan, ] )) df codes 0 {'amount': 12, 'code': 'a'} 1 {'amount': 19, 'code': 'x'} 2 {'amount': 37, 'code': 'm'} 3 NaN 4 NaN 5 NaN
apply
con pd.Series
Asegúrate de dejar dropna
primero
df.codes.dropna().apply(pd.Series) amount code 0 12 a 1 19 x 2 37 m
df.drop('codes', 1).assign(**df.codes.dropna().apply(pd.Series)) amount code 0 12.0 a 1 19.0 x 2 37.0 m 3 NaN NaN 4 NaN NaN 5 NaN NaN
tolist
y from_records
La misma idea pero omitir la apply
pd.DataFrame.from_records(df.codes.dropna().tolist()) amount code 0 12 a 1 19 x 2 37 m
df.drop('codes', 1).assign(**pd.DataFrame.from_records(df.codes.dropna().tolist())) amount code 0 12.0 a 1 19.0 x 2 37.0 m 3 NaN NaN 4 NaN NaN 5 NaN NaN
Preparar
codes 0 {'amount': 12, 'code': 10} 1 {'amount': 3, 'code': 3}
apply
con pd.Series
df.codes.apply(pd.Series) amount code 0 12 10 1 3 3