【问题标题】:Parse column of nested JSON as pandas DataFrame将嵌套 JSON 的列解析为 pandas DataFrame
【发布时间】:2019-05-05 05:19:02
【问题描述】:

如何在 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

【问题讨论】:

  • 您的 JSON 式 col2 中的不一致引用实际上是您要解析的吗?实例化您提供的 DataFrame 有效,但使用 ast.literal_eval 进行下一步不起作用,因为那不是有效的字典。实际上还没有尝试过json 库...
  • 没有。更新了数据。
  • 为了清楚起见,您能否也包含您想要的输出?
  • 将其添加到问题中。

标签: python json pandas dataframe


【解决方案1】:

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

【讨论】:

  • 您的代码出现“ValueError: malformed node or string: <_ast.name object at>”。
  • @GeorgHeiler 那是因为你的 JSON 格式不正确。你想怎么做?
  • 我在上面提到这个错误不是故意的。应假定有效 JSON 并修复虚拟数据。
  • @GeorgHeiler 稍作修改。尝试使用我帖子中提供的初始化运行我的代码?
  • 确实如此。这很棒。但是,这还不能处理None。你介意添加它吗?我知道它缺少最小样本,但对于更完整的样本来说会很棒。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 2019-06-09
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多