我想将 API 调用的结果转换为数据框。 API 调用的结果是嵌套字典,但生成的数据框不是我需要的。
除了json_normalize,我还尝试了pd.DataFrame.from_dict。然而,直到现在都没有成功。我也试过压平字典,但没有。
我使用了以下调用:
[73] results = requests.get(url).json()
results
输出是:
{'result': {'totalrows': 3124,
'rows': [{'rownum': 1,
'values': [{'field': 'querydate', 'value': '7/31/2019 3:19 PM'},
{'field': 'issueid', 'value': 472683},
{'field': 'ticker', 'value': 'AAPL'},
{'field': 'companyname', 'value': 'APPLE INC'},
{'field': 'issuetitle', 'value': 'COM'},
{'field': 'filerid', 'value': 1089387}]},
{'rownum': 2,
'values': [{'field': 'querydate', 'value': '7/31/2019 3:19 PM'},
{'field': 'issueid', 'value': 472683},
{'field': 'ticker', 'value': 'AAPL'},
{'field': 'companyname', 'value': 'APPLE INC'},
{'field': 'issuetitle', 'value': 'COM'},
{'field': 'filerid', 'value': 1086893}]},
{'rownum': 3,
'values': [{'field': 'querydate', 'value': '7/31/2019 3:19 PM'},
{'field': 'issueid', 'value': 472683},
{'field': 'ticker', 'value': 'AAPL'},
{'field': 'companyname', 'value': 'APPLE INC'},
{'field': 'issuetitle', 'value': 'COM'},
{'field': 'filerid', 'value': 1085803}]}
然后为了生成数据框,我使用了以下代码:
[74] Owners = results['result']['rows']
df1 = json_normalize(Owners)
df1.head()
这是输出:
rownum values
0 1 [{'field': 'querydate', 'value': '7/31/2019 3:19 PM'},
{'field': 'issueid', 'value': 472683}, {'field':
'ticker', 'value': 'AAPL'}, {'field': 'companyname',
'value': 'APPLE INC'}, {'field': 'issuetitle', 'value':
'COM'}, {'field': 'filerid', 'value': 1089387}
1 2 [{'field': 'querydate', 'value': '7/31/2019 3:19 PM'},
{'field': 'issueid', 'value': 472683}, {'field':
'ticker', 'value': 'AAPL'}, {'field': 'companyname',
'value': 'APPLE INC'}, {'field': 'issuetitle', 'value':
'COM'}, {'field': 'filerid', 'value': 1086893}
2 3 [{'field': 'querydate', 'value': '7/31/2019 3:19 PM'}, {'field':
'issueid', 'value': 472683}, {'field': 'ticker', 'value': 'AAPL'},
{'field': 'companyname', 'value': 'APPLE INC'}, {'field':
'issuetitle', 'value': 'COM'}, {'field': 'filerid', 'value': 1085803}
但是,我想获取具有以下格式的DataFrame:
最佳答案
您可以使用 pandas.DataFrame.from_dict
但您需要删除数据中所有不必要的数据。实际上,您只想保留每行的 field
值和 value
。你可以用列表理解来做到这一点:
data = [{ field["field"]:field["value"] for field in row['values']
} for row in data['result']["rows"]]
print(data)
# [{'querydate': '7/31/2019 3:19 PM',
# 'issueid': 472683,
# 'ticker': 'AAPL',
# 'companyname': 'APPLE INC',
# 'issuetitle': 'COM',
# 'filerid': 1089387},
# {
# 'querydate': '7/31/2019 3:19 PM',
# 'issueid': 472683,
# 'ticker': 'AAPL',
# 'companyname': 'APPLE INC',
# 'issuetitle': 'COM',
# 'filerid': 1086893},
# {
# 'querydate': '7/31/2019 3:19 PM',
# 'issueid': 472683,
# 'ticker': 'AAPL',
# 'companyname': 'APPLE INC',
# 'issuetitle': 'COM',
# 'filerid': 1085803
# }]
一旦你有了这个字典,你就可以调用 from_dict
方法:
df = pd.DataFrame.from_dict(data)
print(df)
# companyname filerid issueid issuetitle querydate ticker
# 0 APPLE INC 1089387 472683 COM 7/31/2019 3:19 PM AAPL
# 1 APPLE INC 1086893 472683 COM 7/31/2019 3:19 PM AAPL
# 2 APPLE INC 1085803 472683 COM 7/31/2019 3:19 PM AAPL
如果你想获取 rownum
作为列(或索引):
data = [{**{field["field"]:field["value"] for field in row['values']}, **{'rownum': row["rownum"]}} for row in data['result']["rows"]]
df = pd.DataFrame.from_dict(data)
print(df)
# companyname filerid issueid issuetitle querydate rownum ticker
# 0 APPLE INC 1089387 472683 COM 7/31/2019 3:19 PM 1 AAPL
# 1 APPLE INC 1086893 472683 COM 7/31/2019 3:19 PM 2 AAPL
# 2 APPLE INC 1085803 472683 COM 7/31/2019 3:19 PM 3 AAPL
关于python - 如何将嵌套字典转换为 pandas DataFrame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57299101/