在熊猫中将外部 json 与嵌套的 json 结合起来并创建新的数据框

use*_*388 5 python json pandas

json_str = '[
{
"name": "t1",
"props": [
  {
    "abc": 10012,
    "def": "OBJECT"
  },
  {
    "abc": 999123,
    "def": "SUBJECT"
  }
],
"id": 1,
"title": "king"
},
{
"name": "t2",
"props": [
  {
    "abc": 789456,
    "def": "PRODUCT"
  }
],
"id": 2,
"title": "queen"
}
]'
Run Code Online (Sandbox Code Playgroud)

使用上面的 JSON,我想创建一个扩展props列表并连接到主要 json 列的数据框。

最后,我想在 df 中得到这些列:

id,title,name,abc,def

与行:

1,king,t1,10012,OBJECT

1,king,t1,999123,SUBJECT

2,queen,t2,789456,PRODUCT

当我尝试这个时:

jdata = json.loads(json_str)
pd.concat([pd.DataFrame(jdata), pd.DataFrame(list(jdata['props']))], axis=1).drop('props', 1)
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

列表索引必须是整数或切片,而不是 str

也试过这个:

jdata=json.loads(json_str)
pd.concat([pd.DataFrame(jdata), pd.DataFrame([pd.json_normalize(jdata, "props", errors="ignore", record_prefix="")])], axis=1).drop('props', 1)
Run Code Online (Sandbox Code Playgroud)

抛出这个错误:

必须通过二维输入。形状={values.shape}

也试过这个:

result = pd.json_normalize(jdata, 'props', errors="ignore", record_prefix="props.")
result2 = pd.json_normalize(jdata, errors="ignore", record_prefix="tmpl.")
df = pd.concat([result, result2], axis=1).drop('props', 1)
Run Code Online (Sandbox Code Playgroud)

这里没有抛出错误,但是 concat没有将两个 df 对齐。行不同步。

谢谢你的帮助。