json_normalize
- это правильный способ работы с вложенными данными JSON.
import ast
from pandas.io.json import json_normalize
v = json_normalize([ast.literal_eval(j) for j in df.pop('col2')], sep='_')
pd.concat([df, v], 1)
col1 bar baz_foo baz_x foo
0 1 2 2 1 1
1 2 5 2 1 3
Обратите внимание, что вам все равно придется сначала преобразовать JSON в словарь.
Есливы хотите обрабатывать NaN в "col2", попробуйте использовать join
в конце:
df = pd.DataFrame({
'col1':[1,2,3],
'col2':["{'foo':1, 'bar':2, 'baz':{'foo':2, 'x':1}}",
"{'foo':3, 'bar':5, 'baz':{'foo':2, 'x':1}}",
np.nan]})
v = json_normalize([
ast.literal_eval(j) for j in df['col2'].dropna()], sep='_'
)
v.index = df.index[df.pop('col2').notna()]
df.join(v, how='left')
col1 bar baz_foo baz_x foo
0 1 2.0 2.0 1.0 1.0
1 2 5.0 2.0 1.0 3.0
2 3 NaN NaN NaN NaN