代码之家  ›  专栏  ›  技术社区  ›  Georg Heiler

将嵌套JSON的列解析为数据帧

  •  2
  • Georg Heiler  · 技术社区  · 7 年前

    如何简单地在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 回复  |  直到 7 年前
        1
  •  5
  •   cs95 abhishek58g    7 年前

    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转换为字典。


    如果您想在“col2”中处理nan,请尝试使用 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
    
        2
  •  0
  •   Joseph Cottam    7 年前

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