Какую функцию я использую для перебора параметров URL-адреса и отображения его в фрейме данных Pandas?

#python #pandas #dataframe #python-requests

Вопрос:

Я выполнял некоторые запросы API, используя запросы и Панды. Теперь я пытаюсь использовать цикл for для перебора списка параметров URL. Когда я тестирую с помощью print(), я получаю ответ JSON для всего списка. Что я действительно хочу сделать, так это превратить ответ в фрейм данных Pandas, но я не знаю, какую функцию я могу использовать для этого.

 import requests
import requests_cache
from requests_cache import CachedSession
import pandas as pd

session = CachedSession()

base_url = "https://api.crossref.org/works/"
for doi in ["10.4324/9780429202483", "10.1177/2053168017702990", "10.1016/j.chb.2019.05.017", "10810730.2017.1421730," "10.1002/wmh3.247", "10.1177/1940161220919082"]:
  url = base_url   str(doi)
  response = session.get(url, headers={"mailto":"myemail@email.com"})
  data = response.json()['message']
  dataframe = pd.json_normalize(data)
  dataframe.head(6)
 

В принципе, я пытаюсь создать фрейм данных, подобный приведенному ниже, но с шестью строками, по одной для каждого из параметров.
Таблицы данных

Ответ №1:

Если я вас правильно понял, вы хотите создать фрейм данных с количеством строк, равным количеству параметров.

Вы можете использовать max_level=1 pd.json_normalize() функцию для создания фрейма данных только с одной строкой, а затем объединить шесть фреймов данных в один с pd.concat :

 import requests
import pandas as pd

base_url = "https://api.crossref.org/works/"
lst = [
    "10.4324/9780429202483",
    "10.1177/2053168017702990",
    "10.1016/j.chb.2019.05.017",
    "10810730.2017.1421730," "10.1002/wmh3.247",
    "10.1177/1940161220919082",
]

dfs = []
with requests.session() as session:
    for doi in lst:
        url = base_url   str(doi)
        response = session.get(url, headers={"mailto": "myemail@email.com"})
        data = response.json()["message"]
        dataframe = pd.json_normalize(data, max_level=1)
        dfs.append(dataframe)

df = pd.concat(dfs, ignore_index=True)
print(df[["reference-count", "publisher", "isbn-type"]]) # <-- print only few columns for brevity
 

С принтами:

    reference-count          publisher                                           isbn-type
0                0          Routledge  [{'value': '9780429202483', 'type': 'electronic'}]
1               31  SAGE Publications                                                 NaN
2               89        Elsevier BV                                                 NaN
3               27              Wiley                                                 NaN
4               54  SAGE Publications                                                 NaN
 

Комментарии:

1. Большое спасибо, Андрей! Этот код-то, что мне было нужно.