首页 > 解决方案 > JSON(嵌套)对象到 Pandas Dataframe

问题描述

我一直在尝试将嵌套的 JSON 对象展平为 pandas 数据框。我尝试了多种方法,但似乎仍然找不到有效的解决方案。

Json 链接在这里:https ://www.predictit.org/api/marketdata/all/

Pandas.read_json 输出如下所示:

1 {'id': 1, 'name': '马克·库班会竞选...

2 {'id': 1, 'name': 'Andrew Cuomo 会不会跑...

3 {'id': 2901, 'name': 'Will a woman be elected ...

4 {'id': 2902, 'name': '2020 年民主党...

我希望它具有 ID、名称等作为 pandas 数据框中的列。

我知道这是一个相当基本的问题,但我遇到了障碍,希望能得到任何帮助。

谢谢你。

附录:

这是我正在使用的代码位:

这工作正常:

http = urllib3.PoolManager()
r = http.request('GET', 'https://www.predictit.org/api/marketdata/all/')

然后,我尝试了以下方法:

df_data = pandas.json_normalize(r.data)
#I've tried about a dozen different variations playing the variables passed but always get the same result or the same result transposed into a very large column and 1 row.

df_data = pandas.read_json(r.data)
#again, same is true for trying a ton of variable combinations

df_data = pandas.read_json(r.data)
df_dat = df_data.drop('markets') #and
df_dat = df_data.drop([markets])

我现在正在考虑使用 json 库导入 json 对象,然后转储到 CSV 中,如果问题仍然存在,则手动删除第一个 Column 和 Row,然后重新导入它。

如果我可以提供任何其他信息,请告诉我。

标签: pythonjsonpandas

解决方案


您应该markets像这样获得 dict 的值(并且无需使用read_json):

import pandas as pd
import requests

pd.set_option('display.max_columns', 5)
pd.set_option('display.width', 260)
pd.set_option('mode.use_inf_as_na', True)


proxy = {"http": "http://127.0.0.1:1080", "https": "https://127.0.0.1:1080"}

r = requests.get('https://www.predictit.org/api/marketdata/all/', proxies=proxy, verify=False)

df = pd.DataFrame(r.json()['markets'])

print(df.head())

     id                                               name  ...                    timeStamp status
0  2721  Which party will win the 2020 U.S. presidentia...  ...  2020-03-18T22:23:43.4549039   Open
1  2747         Will Mark Cuban run for president in 2020?  ...  2020-03-18T22:23:43.4549039   Open
2  2875       Will Andrew Cuomo run for president in 2020?  ...  2020-03-18T22:23:43.4549039   Open
3  2901    Will a woman be elected U.S. president in 2020?  ...  2020-03-18T22:23:43.4549039   Open
4  2902  Will the 2020 Democratic nominee for president...  ...  2020-03-18T22:23:43.4549039   Open

[5 rows x 8 columns]

并且列contracts是嵌套的,您可以使用 dfapply打开它。


推荐阅读