一般来说,我是 Python 和 API 的新手,所以这可能是一个简单回答的基本问题。我正在尝试使用 Python从Propublica 的 API获取有关国会代表的数据。我可以让 REST API 运行,但是在将生成的 json 数据正确地构建为数据框时遇到了问题。我认为这是因为数据中有多个嵌套级别。我尝试规范化数据,但我只能让它在第一个嵌套级别上工作。
这是我的代码。请注意,我已经删除了我的 API 密钥,但您可以在这里快速轻松地获得一个。
# Import programs
import pandas as pd
from pandas.io.json import json_normalize
import requests
import json
import time
import csv
### Index 0
# Requesting data trhough API
payload = {'X-API-Key': 'a876543211234'}
terms = '"trade war"AND"China"'
index = str(0) # 440 is last offset for this call
response = requests.get('https://api.propublica.org/congress/v1/116/house/members.json', headers=payload)
print(response.status_code)
#Formating json files better
json_data = json.loads(response.content.decode("utf-8"))
# Writing Data as String
json_string = json.dumps(json_data)
# Creating Stage 1 dataframe
jdata = json.loads(json_string)
df = pd.DataFrame(jdata)
df2 = pd.DataFrame(df.results)
# Normalizing Data - converts nested data into a regular looking dataframe
normal_data_0 = json_normalize(data=df['results'])
这就是 JSON 数据的样子。请注意,所有代表的数据都嵌套在“结果”和“成员”下:
{'status': 'OK',
'copyright': ' Copyright (c) 2021 Pro Publica Inc. All Rights Reserved.',
'results': [{'congress': '116',
'chamber': 'House',
'num_results': 451,
'offset': 0,
'members': [{'id': 'A000374',
'title': 'Representative',
'short_title': 'Rep.',
'api_uri': 'https://api.propublica.org/congress/v1/members/A000374.json',
'first_name': 'Ralph',
'middle_name': None,
'last_name': 'Abraham',
'suffix': None,
'date_of_birth': '1954-09-16',
'gender': 'M',
'party': 'R',
'leadership_role': '',
'twitter_account': 'RepAbraham',
'facebook_account': 'CongressmanRalphAbraham',
'youtube_account': None,
'govtrack_id': '412630',
'cspan_id': '76236',
'votesmart_id': '155414',
'icpsr_id': '21522',
'crp_id': 'N00036633',
'google_entity_id': '/m/012dwd7_',
'fec_candidate_id': 'H4LA05221',
'url': 'https://abraham.house.gov',
'rss_url': 'https://abraham.house.gov/rss.xml',
'contact_form': None,
'in_office': False,
'cook_pvi': 'R+15',
'dw_nominate': 0.541,
'ideal_point': None,
'seniority': '6',
'next_election': '2020',
'total_votes': 954,
'missed_votes': 377,
'total_present': 0,
'last_updated': '2020-12-31 18:30:50 -0500',
'ocd_id': 'ocd-division/country:us/state:la/cd:5',
'office': '417 Cannon House Office Building',
'phone': '202-225-8490',
'fax': None,
'state': 'LA',
'district': '5',
'at_large': False,
'geoid': '2205',
'missed_votes_pct': 39.52,
'votes_with_party_pct': 94.93,
'votes_against_party_pct': 4.9},
{'id': 'A000370',
'title': 'Representative',
...
这就是我的“数据集”的样子。所有 JSON 数据都作为字符串存储在唯一行的“成员”列中:
normal_data_0
congress chamber num_results offset members
0 116 House 451 0 [{'id': 'A000374', 'title': 'Representative', ...
我已经尝试过json_normalize
两次运行数据,并且还添加了两个变量[results,members]
。我试过的都没有用。
有什么建议么?