Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 使用多个API创建数据帧会将结果附加到一个列表中_Json_Pandas_Api_Dataframe - Fatal编程技术网

Json 使用多个API创建数据帧会将结果附加到一个列表中

Json 使用多个API创建数据帧会将结果附加到一个列表中,json,pandas,api,dataframe,Json,Pandas,Api,Dataframe,我有一个附加了几个16 API GET结果的列表,我正在努力将它们转换成一个数据帧。原始结果如下所示: [{“总计”:17,“结果”:[{“类别”:[],“创建地点”:“2020-01-05 13:42:19.576875”,“图标url”:”https://assets.chucknorris.host/img/avatar/chuck-norris.png,id:“Tg3Q ujvSpOXmrrkZUhVHA”,“更新地址:”“2020-01-05 13:42:19.576875”,“url

我有一个附加了几个16 API GET结果的列表,我正在努力将它们转换成一个数据帧。原始结果如下所示:

[{“总计”:17,“结果”:[{“类别”:[],“创建地点”:“2020-01-05 13:42:19.576875”,“图标url”:”https://assets.chucknorris.host/img/avatar/chuck-norris.png,id:“Tg3Q ujvSpOXmrrkZUhVHA”,“更新地址:”“2020-01-05 13:42:19.576875”,“url:”https://api.chucknorris.io/jokes/Tg3Q-ujvSpOXmrrkZUhVHA,“价值”:“Chuck Norris相信Shanimal岩石。”},{“类别”:[],“创建地点”:“2020-01-05 13:42:20.568859”,“图标url”:https://assets.chucknorris.host/img/avatar/chuck-norris.png,id:“5D6ilY48Q8yoE4_Chu U8Dw”,“更新地址:”“2020-01-05 13:42:20.568859”,“url:”https://api.chucknorris.io/jokes/5D6ilY48Q8yoE4_ch_U8Dw,“价值”:“蜜獾”(吉尼斯世界纪录中最勇敢的动物)在床下检查 查克·诺里斯的每一个夜晚。”},(…)

我无法正确获取列。它无法识别其中的键,并且只允许我创建一列:

df_chuck_jokes = pd.DataFrame(response_list, columns=['categories'])

当我在寻找这样的东西时:


这是您先前文章的扩展,但现在您已经显示了答案,请修改原始问题的答案,如下所示。您可以创建16个数据帧,然后合并,而不是创建一个答案列表

df_list = [] #capture list of dataframes 
for s in list(r.keys()): # replace list(r.keys()) with your list
    querystring = {"query":s}
    response = requests.request("GET", url, headers=headers, params=querystring)
    print(response.text)
    data = response.text
    df_list.append(pd.DataFrame(data['result']) #append list of dfs
df = pd.concat(df_list, axis=0) #concat the individual dfs to one large df
数据是什么样子的

In [614]: data
Out[614]:
{'total': 17,
 'result': [{'categories': [],
   'created_at': '2020-01-05 13:42:19.576875',
   'icon_url': 'https://assets.chucknorris.host/img/avatar/chuck-norris.png',
   'id': 'Tg3Q-ujvSpOXmrrkZUhVHA',
   'updated_at': '2020-01-05 13:42:19.576875',
   'url': 'https://api.chucknorris.io/jokes/Tg3Q-ujvSpOXmrrkZUhVHA',
   'value': 'Chuck Norris believes that Shanimal rocks.'},
  {'categories': [],
   'created_at': '2020-01-05 13:42:20.568859',
   'icon_url': 'https://assets.chucknorris.host/img/avatar/chuck-norris.png',
   'id': '5D6ilY48Q8yoE4_ch_U8Dw',
   'updated_at': '2020-01-05 13:42:20.568859',
   'url': 'https://api.chucknorris.io/jokes/5D6ilY48Q8yoE4_ch_U8Dw',
   'value': 'The Honey Badger (most fearless animal in the Guinness Book of World Records) checks under its bed\ufeff every night for Chuck Norris.'}]}
In [615]: pd.DataFrame(data['result'])
Out[615]:
  categories                  created_at                                           icon_url  ...                  updated_at                                                url                                              value
0         []  2020-01-05 13:42:19.576875  https://assets.chucknorris.host/img/avatar/chu...  ...  2020-01-05 13:42:19.576875  https://api.chucknorris.io/jokes/Tg3Q-ujvSpOXm...         Chuck Norris believes that Shanimal rocks.
1         []  2020-01-05 13:42:20.568859  https://assets.chucknorris.host/img/avatar/chu...  ...  2020-01-05 13:42:20.568859  https://api.chucknorris.io/jokes/5D6ilY48Q8yoE...  The Honey Badger (most fearless animal in the ...

[2 rows x 7 columns]
16个dfs中的每一个看起来像什么

In [614]: data
Out[614]:
{'total': 17,
 'result': [{'categories': [],
   'created_at': '2020-01-05 13:42:19.576875',
   'icon_url': 'https://assets.chucknorris.host/img/avatar/chuck-norris.png',
   'id': 'Tg3Q-ujvSpOXmrrkZUhVHA',
   'updated_at': '2020-01-05 13:42:19.576875',
   'url': 'https://api.chucknorris.io/jokes/Tg3Q-ujvSpOXmrrkZUhVHA',
   'value': 'Chuck Norris believes that Shanimal rocks.'},
  {'categories': [],
   'created_at': '2020-01-05 13:42:20.568859',
   'icon_url': 'https://assets.chucknorris.host/img/avatar/chuck-norris.png',
   'id': '5D6ilY48Q8yoE4_ch_U8Dw',
   'updated_at': '2020-01-05 13:42:20.568859',
   'url': 'https://api.chucknorris.io/jokes/5D6ilY48Q8yoE4_ch_U8Dw',
   'value': 'The Honey Badger (most fearless animal in the Guinness Book of World Records) checks under its bed\ufeff every night for Chuck Norris.'}]}
In [615]: pd.DataFrame(data['result'])
Out[615]:
  categories                  created_at                                           icon_url  ...                  updated_at                                                url                                              value
0         []  2020-01-05 13:42:19.576875  https://assets.chucknorris.host/img/avatar/chu...  ...  2020-01-05 13:42:19.576875  https://api.chucknorris.io/jokes/Tg3Q-ujvSpOXm...         Chuck Norris believes that Shanimal rocks.
1         []  2020-01-05 13:42:20.568859  https://assets.chucknorris.host/img/avatar/chu...  ...  2020-01-05 13:42:20.568859  https://api.chucknorris.io/jokes/5D6ilY48Q8yoE...  The Honey Badger (most fearless animal in the ...

[2 rows x 7 columns]
完整的代码(如果没有@jonathan leon的大力帮助,这是不可能的):

首先,我们得到笑话类别:

import requests

url = "https://matchilling-chuck-norris-jokes-v1.p.rapidapi.com/jokes/categories"

headers = {
    'accept': "application/json",
    'x-rapidapi-key': "xxxx",
    'x-rapidapi-host': "matchilling-chuck-norris-jokes-v1.p.rapidapi.com"
    }

response = requests.request("GET", url, headers=headers)
r = response.json() # using json to transform the requested data into a class list
将其转换为数据帧。这可能不需要,但在我开始工作时,我发现使用DFs更容易:

df_chuck_categories = pd.DataFrame(r, columns=['category'])
现在我们回到API并请求所有类别信息。我通过将响应更改为json调整了前面的响应:

import requests

url = "https://matchilling-chuck-norris-jokes-v1.p.rapidapi.com/jokes/search"
headers = {
    'accept': "application/json",
    'x-rapidapi-key': "xxxx",
    'x-rapidapi-host': "matchilling-chuck-norris-jokes-v1.p.rapidapi.com"
    }                  

df_list = [] #capture list of dataframes
for s in list(df_chuck_categories['category']): # replace list(r.keys()) with your list
    querystring = {'query':s}
    response = requests.request("GET", url, headers=headers, params=querystring)
#   print(response.text) # uncomment to check if requests is working
    data = response.json()
    df_list.append(pd.DataFrame(data['result'])) #append list of dfs
    df_chuck_jokes = pd.concat(df_list, axis=0) #concat the individual dfs to one large df
最后,我们只是重置索引,使其从开始到结束按顺序计数

df_chuck_jokes = df_chuck_jokes.reset_index(drop=True)

如果您的API返回json,您应该尝试Pandas.hi的“read_json”函数,再次感谢您的帮助。最后一行--File“”,第16行df=pd.concat(df_list,axis=0)出现错误#将单个dfs连接到一个大df^语法错误:无效语法如果我在没有连接大df的最后一行的情况下运行它,我会得到--File“”,第16行df_list.append(pd.DataFrame(data['result'])#dfs^语法附加列表错误:分析时出现意外的EOF如果我在没有最后两行的情况下运行它,它会迭代并从API获取值,但是如果没有它们,df#U列表将为空。看起来我在附加行上缺少一个右括号。请检查,因为我没有“无法完全测试。您完全正确。但在16 print(response.text)17 data=response.text中追加DFs时仍会出现错误-------------------------------------------------------------------TypeError Traceback(最近一次调用)17 data=response.text-->18 df_list.append”(pd.DataFrame(data['result'])#追加dfs 19的列表df=pd.concat(df_列表,axis=0)#将单个dfs合并到一个大的df类型错误:字符串索引必须是整数