Ключевая ошибка в Python при использовании Pycharm и Панд

#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. Нет проблем! Это звучит как отдельная проблема, которая требует нового вопроса. Если мой ответ решил вашу проблему, пожалуйста, примите его, нажав на галочку слева 🙂