将嵌套JSON列解析为pandas DataFrame

时间:2018-12-03 20:59:57

标签: python json pandas dataframe

如何简单地将pandas内的JSON列分开:

pd.DataFrame({
    'col1':[1,2], 
    'col2':["{'foo':1, 'bar':2, 'baz':{'foo':2, 'x':1}}",
            "{'foo':3, 'bar':5, 'baz':{'foo':2, 'x':1}}"]})

   col1                                        col2
0     1  {'foo':1, 'bar':2, 'baz':{'foo':2, 'x':1}}
1     2  {'foo':3, 'bar':5, 'baz':{'foo':2, 'x':1}}

以简单的python方式转换为实列吗?

编辑

所需的输出:

pd.DataFrame({'col1':[1,2], 'foo':[1,3], 'bar':[2,5], 
              'baz_foo':[2,2], 'baz_x':[1,1]})

   col1  foo  bar  baz_foo  baz_x
0     1    1    2        2      1
1     2    3    5        2      1

2 个答案:

答案 0 :(得分:5)

l : loop # b = b是处理嵌套JSON数据的正确方法。

json_normalize

请注意,您仍然必须先将JSON转换为字典。


如果要在“ col2”中处理NaN,请尝试在最后使用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

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]})

答案 1 :(得分:0)

json_normalize将嵌套的类似json的字典更改为表。嵌套路径用于创建列名。

import pandas as pd
from pandas.io.json import json_normalize

data = {'col1':[1,2,3], 
        'col2':[{'foo': 1, 'bar': 2, 'baz': {'foo': 2, 'x': 1}},
                {'foo': 3, 'bar': 5, 'baz': {'foo': None, 'x': 1}}]}

pd.DataFrame(data={"col1": data["col1"]})\
  .join(json_normalize(data["col2"]))