Python 将数据从api保存到数据帧

Python 将数据从api保存到数据帧,python,json,api,Python,Json,Api,从API获取数据时,我有以下输出: {'Textbook': [{'Type': 'Chapters', 'Case': 'Ch09', 'Rates': [{'Date': '2021- 04-23T00:00:00', 'Rate': 10.0}, {'Date': '2021-04-26T00:00:00', 'Rate': 10.0}, {'Date': '2021-04-27T00:00:00', 'Rate': 10.5}, {'Date': '2021-04-28T00:00:

从API获取数据时,我有以下输出:

{'Textbook': [{'Type': 'Chapters', 'Case': 'Ch09', 'Rates': 
[{'Date': '2021- 04-23T00:00:00', 'Rate': 10.0}, {'Date': '2021-04-26T00:00:00', 'Rate': 10.0}, 
{'Date': '2021-04-27T00:00:00', 'Rate': 10.5}, {'Date': '2021-04-28T00:00:00', 'Rate': 10.5}, 
{'Date': '2021-04-29T00:00:00', 'Rate': 10.5}, {'Date': '2021-04-30T00:00:00', 'Rate': 10.0}]}]}
我试图在数据帧中获得以下输出:

Date                           Rate
2021- 04-23T00:00:00          10.0
2021-04-26T00:00:00           10.0
2021-04-27T00:00:00           10.5

我尝试了以下代码:

l=parsed ###this is the output from API 
df=pd.DataFrame()
for i in l:
   d1 = {}
   reportDate = []
   price = []
   for j in i['Chapters']:
      reportDate.append(j['Date'])
      price.append(j['Rate'])
   d1['Date'] = reportDate
   d1['Rate'] = price
df = df.append(pd.DataFrame(d1))
df['Date'] = pd.to_datetime(df['Date'])
但是,我得到了以下错误:
字符串索引必须是I['Chapters']中j的
行的整数:

您可以尝试以下方法:

d = {'Textbook': [{'Type': 'Chapters', 'Case': 'Ch09', 'Rates':
[{'Date': '2021- 04-23T00:00:00', 'Rate': 10.0}, {'Date': '2021-04-26T00:00:00', 'Rate': 10.0},
{'Date': '2021-04-27T00:00:00', 'Rate': 10.5}, {'Date': '2021-04-28T00:00:00', 'Rate': 10.5},
{'Date': '2021-04-29T00:00:00', 'Rate': 10.5}, {'Date': '2021-04-30T00:00:00', 'Rate': 10.0}]}]}

pd.DataFrame(d.get('Textbook')[0].get('Rates'))

#                    Date  Rate
# 0  2021- 04-23T00:00:00  10.0
# 1   2021-04-26T00:00:00  10.0
# 2   2021-04-27T00:00:00  10.5
# 3   2021-04-28T00:00:00  10.5
# 4   2021-04-29T00:00:00  10.5
# 5   2021-04-30T00:00:00  10.0
你问题的可能解决方案 您可以在此处阅读文档:

您可以尝试此代码

d={'tupbook':[{'Type':'Chapters','Case':'Ch09','Rates':
[{'Date':'2021-04-23T00:00:00','Rate':10.0},{'Date':'2021-04-26T00:00:00','Rate':10.0},
{'Date':'2021-04-27T00:00:00','Rate':10.5},{'Date':'2021-04-28500:00:00','Rate':10.5},
{'Date':'2021-04-29T00:00:00','Rate':10.5},{'Date':'2021-04-30T00:00:00','Rate':10.0}
pd.DataFrame(d.get('textute')[0]。get('Rates'))

代码不起作用?请在下面发表评论。。任何其他问题,我都很乐意回答。

下面的代码修复将解决您的问题。虽然安德烈亚斯的答案是一种蟒蛇式的方式

import ast

# Data setup
raw_data="""
{'Textbook': [{'Type': 'Chapters', 'Case': 'Ch09', 'Rates': 
[{'Date': '2021- 04-23T00:00:00', 'Rate': 10.0}, {'Date': '2021-04-26T00:00:00', 'Rate': 10.0}, 
{'Date': '2021-04-27T00:00:00', 'Rate': 10.5}, {'Date': '2021-04-28T00:00:00', 'Rate': 10.5}, 
{'Date': '2021-04-29T00:00:00', 'Rate': 10.5}, {'Date': '2021-04-30T00:00:00', 'Rate': 10.0}]}]}
"""
val=ast.literal_eval(raw_data) # eval to dictionary

解决方案是(请查看评论部分)


您的代码每次都会重置<例如,代码>价格
在尝试将其分配给列之前会被多次覆盖
l=val ###this is the output from API, added val in this example 
reportDate = [] # moved out of loop to collect the data
price = [] # moved out of loop to collect the data
#df=pd.DataFrame() build the dataframe once all the data is ready
for i in l: # this is dictionary
    #d1 = {} not needed
    
    for j in l[i][0]['Rates']:
        reportDate.append(j['Date'])
        price.append(j['Rate'])
    #d1['Date'] = reportDate
    #d1['Rate'] = price
#df = df.append(pd.DataFrame(d1))
#df['Date'] = pd.to_datetime(df['Date'])
df=pd.DataFrame({'Date':reportDate,"Rate":price})