【问题标题】:JSON to Pandas dataframe. How to parse inner parts of JSONJSON 到 Pandas 数据框。如何解析 JSON 的内部部分
【发布时间】:2021-05-28 11:26:17
【问题描述】:

我正在尝试解析一个 json 并将结果插入到 pandas 数据框中。

我的 json 看起来像

{'result': {'data': [{'dimensions': [{'id': '219876173',
      'name': 'Our great product'},
     {'id': '2021-03-01', 'name': ''}],
    'metrics': [41, 4945]},
   {'dimensions': [{'id': '219876173',
      'name': 'Our great product'},
     {'id': '2021-03-02', 'name': ''}],
    'metrics': [31, 2645]},
   {'dimensions': [{'id': '219876166',
      'name': 'Our awesome product'},
     {'id': '2021-03-01', 'name': ''}], ....

到目前为止,我已经做到了这一点:

[{'dimensions': [{'id': '219876173',
    'name': 'Our great product'},
   {'id': '2021-03-01', 'name': ''}],
  'metrics': [41, 4945]},
 {'dimensions': [{'id': '219876173',
    'name': 'Our great product'},
   {'id': '2021-03-02', 'name': ''}],
  'metrics': [31, 2645]},

但是,当我把它放在 Pandas 中时,我得到了

   dimensions                                                                metrics
0   [{'id': '219876173', 'name': 'Our great product...   [41, 4945]
1   [{'id': '219876173', 'name': 'Our great product...   [31, 2645]
2   [{'id': '219876166', 'name': 'Our awesome product...   [27, 2475]

我现在可以使用一些 lambda 手动将结果拆分为列

df = pd.io.json.json_normalize(r.json().get('result').get('data'))
df['delivered_units'] = df['metrics'].apply(lambda x: x[0])
df['revenue'] = df['metrics'].apply(lambda x: x[1])
df['name'] = df['dimensions'].apply(lambda x: x[0])
df['sku'] = df['name'].apply(lambda x: x['name'])

有没有更好的方法来直接解析 json 而无需 lambdas?

【问题讨论】:

  • 请发布您的预期输出。请数据不是图片

标签: json pandas dataframe


【解决方案1】:

查看 flatten_json:

data = {'result': {'data': [{'dimensions': [{'id': '219876173',
      'name': 'Our great product'},
     {'id': '2021-03-01', 'name': ''}],
    'metrics': [41, 4945]},
   {'dimensions': [{'id': '219876173',
      'name': 'Our great product'},
     {'id': '2021-03-02', 'name': ''}],
    'metrics': [31, 2645]},
   {'dimensions': [{'id': '219876166',
      'name': 'Our awesome product'},
     {'id': '2021-03-01', 'name': ''}]}]}}

from flatten_json import flatten
dic_flattened = (flatten(d, '.') for d in data['result']['data'])
df = pd.DataFrame(dic_flattened)

  dimensions.0.id    dimensions.0.name dimensions.1.id dimensions.1.name  metrics.0  metrics.1
0       219876173    Our great product      2021-03-01                         41.0     4945.0
1       219876173    Our great product      2021-03-02                         31.0     2645.0
2       219876166  Our awesome product      2021-03-01                          NaN        NaN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多