#python #pandas #pycharm #keyerror
Вопрос:
Я начинающий пользователь Python, и у меня возникли проблемы с устранением ключевой ошибки. Я проверил аналогичные вопросы, но все еще не могу решить свою проблему. Ниже приведена ошибка, за которой следует код. Я был бы признателен за любую информацию.
Error (in line 61):
KeyError: "['Major Office Locations', 'Major Office', '# of International Offices', '# of Attorneys', 'Major Departments', '# of U.S offices'] not in index"
Код:
import requests
import json
import pandas as pd
from bs4 import BeautifulSoup
import re
import concurrent.futures
import sys
URL = 'https://www.vault.com/vault/api/Rankings/LoadMoreCompanyRanksJSON'
pg = 0
info = []
rank = input('Enter Rankn 2 -All Law Firmsn 20 -IP Law Firmsn 275 - IP boutique law firmsn')
year = input('Which Year? ')
filename = input('Filename? ')
while True:
pg = 1
params = {'rank': rank,
'year': year,
'category': 'LBACCompany',
'pg': pg}
response = requests.get(URL, params=params)
if len(json.loads(response.content)) == 0:
break
print(pg)
info = info json.loads(response.content)
def run(i):
response = requests.get('http://vault.com' info[i]['URL'])
print(i)
bs = BeautifulSoup(response.content, 'lxml')
US_OFFICES = bs.find('strong', {'class': 'inlineOnly'}, text='No. of U.S. Offices:').next_sibling.strip()
info[i]['# of U.S offices'] = US_OFFICES
INT_OFFICES = bs.find('strong', {'class': 'inlineOnly'}, text='No. of International Offices:').next_sibling.strip()
info[i]['# of International Offices'] = INT_OFFICES
MAJOR_OFFICE = bs.find('div', {'class': 'col-lg-12 col-md-4'}).p.text.strip()
info[i]['Major Office'] = MAJOR_OFFICE
MAJOR_OFFICE_LOC = bs.find('strong', text='Major Office Locations').parent.p.text.strip()
info[i]['Major Office Locations'] = MAJOR_OFFICE_LOC
MAJOR_DEP = bs.find('strong', text='Major Departments').parent.p.text.strip()
info[i]['Major Departments'] = MAJOR_DEP
ATT = bs.find('strong', text='Firm Stats').parent.p.text
ATT = re.search(r'Total No. Attorneys dddd:rn.*', ATT)
if ATT is not None:
ATT = re.search(r'rn.*[0-9K ]', ATT.group()).group().strip()
info[i]['# of Attorneys'] = ATT
else:
info[i]['# of Attorneys'] = ''
with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor:
executor.map(run, list(range(len(info))))
df = pd.DataFrame(data=info)
df = df[['Year', 'Title', 'Rank', '# of U.S offices',
'# of International Offices', 'Major Office', 'Major Office Locations',
'Major Departments', '# of Attorneys']]
df.to_excel(filename, index=False)
print('DONE!!!!!!!!!!!!!!!!!!')
Ответ №1:
Похоже, вы пытаетесь установить заголовки для фрейма данных (если я правильно догадываюсь). Если это так, вы можете просто передать имена при создании фрейма данных, передав аргумент columns
ключевого слова, например так:
df = pd.DataFrame(data=info, columns=['Year', 'Title', 'Rank', '# of U.S offices', '# of International Offices', 'Major Office', 'Major Office Locations', 'Major Departments', '# of Attorneys'])
Комментарии:
1. Это решило проблему-спасибо! Если я могу побеспокоить вас для получения дополнительной информации, сгенерированный лист Excel содержит только «Год», «Название» и «Ранг». Есть идеи, что может быть причиной этого?
2. Нет проблем! Это звучит как отдельная проблема, которая требует нового вопроса. Если мой ответ решил вашу проблему, пожалуйста, примите его, нажав на галочку слева 🙂