Json 循环通过API多个参数
我有网站的API文档,我要找到在某个城市的学校学习过的所有用户(id为2)。通过运行此代码(Json 循环通过API多个参数,json,python-3.x,if-statement,url,python-requests,Json,Python 3.x,If Statement,Url,Python Requests,我有网站的API文档,我要找到在某个城市的学校学习过的所有用户(id为2)。通过运行此代码(all_users是一个包含上一个任务中用户的主要信息的列表): 我得到这样的数据(这里是输出的一小部分,填充了许多字段): 因此,我在参数“schools”中包含了一个参数“city”,我只需要提取那些具有此参数的用户“city”:2。我试过这个密码: school=[] for user in all_users: user_id=user.get('id') url = f'htt
all_users
是一个包含上一个任务中用户的主要信息的列表):
我得到这样的数据(这里是输出的一小部分,填充了许多字段):
因此,我在参数“schools”中包含了一个参数“city”,我只需要提取那些具有此参数的用户“city”:2
。我试过这个密码:
school=[]
for user in all_users:
user_id=user.get('id')
url = f'http://json-homework.task-sss.krasilnikov.spb.ru/api/user/get?api_key=9f66a575a6cfaaf7e43177317461d057&user_id={user_id}&fields=schools'
data = rq.get(url)
school=school+json.loads(data.text)["response"]
school_norm=json_normalize(school)
schools = school_norm.get('schools')
school2=[]
for i in schools:
if "'city' : 2" in i:
school2.append(json.loads(data.text)["response"])
sch=pd.DataFrame(school2)
但是如果i:中的“'city':2”,则它不接受这样的条件。那么我如何才能完成这项任务呢
我的第一个任务代码是
all_users = []
for page in range(1,42):
url=f'http://json-homework.task-sss.krasilnikov.spb.ru/api/groups/getmembers?api_key=9f66a575a6cfaaf7e43177317461d057&group_id=4508123&page={page}'
data=rq.get(url)
all_users = all_users + json.loads(data.text)["response"]
json_normalize(all_users)
group_data = pd.DataFrame(all_users, columns=['id','first_name','last_name'])
group_data = group_data.sort_values('id')
group_data = group_data.set_index('id')
group_data
以及输出:
因此,在我上面写的任务的输出中,我需要类似于这个数据框架,但只针对那些学校城市id=2的人,正如我之前解释的那样,下面的内容有点复杂,但至少应该让你离你想去的地方足够近。请注意,它假设您的数据是有效的json格式(在您的问题中不是;您必须单独处理它-
无论如何,考虑到这一点,我个人认为处理这类问题的最佳方法是使用jsonpath for python
假设您的数据由两个(有效json)组成,其中一个满足城市id为2的条件,另一个不满足:
schls ="""
[
{
"id": 136840302,
"first_name": "Marina",
"last_name": "Kushnir",
"is_closed": "False,",
"schools": [
{
"id": "352496",
"country": 1,
"city": 57,
"name": "Лицей ИГУ",
"year_from": 2015,
"year_to": 2019,
"class": "",
"type": 2,
"type_str": "Lyceum"
}
]
},
{
"id": 5555555555555,
"first_name": "Marino",
"last_name": "Kush",
"is_closed": "False,",
"schools": [
{
"id": "355556",
"country": 1,
"city": 2,
"name": "Лице ИГ",
"year_from": 2016,
"year_to": 2018,
"class": "",
"type": 4,
"type_str": "Lyceu"
}
]
}
]
"""
让我们来处理数据:
import pandas as pd
import json
from jsonpath_ng import jsonpath, parse
data = json.loads(schls)
jsn_search = parse('$..schools') #this is your search string; looking for info in the "schools" entry
match = jsn_search.find(data) #search for the search string in the loaded json
schools = []
for m in match:
if m.context.value.get('schools')[0].get('city')== 2: #this is your condition!
schools.append(m.context.value) #condition met; append all surrounding info to list
df=pd.DataFrame(schools)
sch = df.drop(['is_closed' , 'schools'] , axis='columns')
sch
输出:
id first_name last_name
0 5555555555555 Marino Kush
你收到了什么错误消息?TypeError:类型为“float”的参数是不可编辑的。虽然当我通过.dtypes
检查时,“schools”列有对象类型,而不是float,但我想我有办法,但我不确定数据框应该是什么样子。根据上面的数据,你能编辑问题并显示df sh是什么吗你看起来像吗?从先前的相关任务中编辑并添加了一点。还有一个问题:在你上面的数据中,“Marina”有两个id:一个似乎是她自己的,一个似乎是她的学校id。哪个id进入你的df?我获取索引器:如果m.context.value.get('schools')[0]。获取('city'),则在这一行列出索引超出范围==2:
@DianaPavlova-是您的实际数据错误还是我在答案中发布的数据错误?@DianaPavlova我再试了一次,效果很好。请尝试打印(len(匹配))
并让我知道它是否输出了2
。如果没有,您在粘贴数据或语句时有一些输入错误。嗯,它输出1@DianaPavlova请参见此处的演示:
import pandas as pd
import json
from jsonpath_ng import jsonpath, parse
data = json.loads(schls)
jsn_search = parse('$..schools') #this is your search string; looking for info in the "schools" entry
match = jsn_search.find(data) #search for the search string in the loaded json
schools = []
for m in match:
if m.context.value.get('schools')[0].get('city')== 2: #this is your condition!
schools.append(m.context.value) #condition met; append all surrounding info to list
df=pd.DataFrame(schools)
sch = df.drop(['is_closed' , 'schools'] , axis='columns')
sch
id first_name last_name
0 5555555555555 Marino Kush