Python Pandas не создается несколько вкладок в файле Excel? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть python скрипт, который извлекается из стороннего API. Сценарий выполняется для 3 разных городов в l oop и создает фрейм данных для каждого города. Затем я передаю фрейм данных на лист Excel в качестве вкладки. Ниже приведен код.

    sublocation_ids = [
                {
                  "id": 163,
                  "name": "Atlanta, GA"
                },
                {
                  "id": 140,
                  "name": "Austin, TX"
                },
                {
                  "id": 164,
                  "name": "Baltimore, MD"
                } 
             ]
filter_text = "(headline:coronavirus OR summary:coronavirus OR headline:covid-19 OR summary:covid-19) AND categories:{}"

writer = pd.ExcelWriter(excel_path)
    for sub in sublocation_ids:
        city_num_int = sub['id']
        city_num_str = str(city_num_int)
        city_name = sub['name']
        filter_text_new = filter_text.format(city_num_str)
        data = json.dumps({"filters": [filter_text_new], "sort_by":"created_at", "size":2})
        r = requests.post(url = api_endpoint, data = data).json()
        articles_list = r["articles"] 
        articles_list_normalized = json_normalize(articles_list)
        df = articles_list_normalized
        df['publication_timestamp'] = pd.to_datetime(df['publication_timestamp'])
        df['publication_timestamp'] = df['publication_timestamp'].apply(lambda x: x.now().strftime('%Y-%m-%d'))
        df.to_excel(writer, sheet_name = city_name)
        writer.save()

Текущая проблема, с которой я сталкиваюсь, заключается в создании только одной вкладки в таблице Excel для первого города "Атланта, Джорджия", для которого я получаю данные из API. Как создать вкладку для каждого города в каталоге или у моего кода есть какие-либо проблемы?

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

См. Этот бит в документации df.to_excel() :

Если вы хотите sh записать более одного листа в рабочей книге, необходимо указать объект ExcelWriter:

df2 = df1.copy()
with pd.ExcelWriter('output.xlsx') as writer:  
    df1.to_excel(writer, sheet_name='Sheet_name_1')
    df2.to_excel(writer, sheet_name='Sheet_name_2') 

Так что вам может потребоваться вытянуть writer.save() за пределы l oop.

1 голос
/ 06 апреля 2020

Я не могу говорить за ваш код, так как не могу его запустить, 'filter_text', кажется, функция, которую вы написали, но не включили.

по сути, у вас есть одна из двух ошибок, которые я вижу ,

сначала неясно, где вы инициализируете объект writer.

2-й, когда вы перезаписываете лист каждым l oop - переместите его за пределы l oop .

pd.ExcelFile можно использовать в качестве менеджера контекста - поэтому вам нужно закрыть / сохранить его.

def close(self):
    """synonym for save, to make it more file-like"""
    return self.save() 

writer = pd.ExcelWriter('file.xlsx')

for sub in sublocation_ids:
    city_num_int = sub['id']
    city_num_str = str(city_num_int)
    city_name = sub['name']
    filter_text_new = filter_text.format(city_num_str)
    data = json.dumps({"filters": [filter_text_new], "sort_by":"created_at", "size":2})
    r = requests.post(url = api_endpoint, data = data).json()
    articles_list = r["articles"] 
    articles_list_normalized = json_normalize(articles_list)
    df = articles_list_normalized
    df['publication_timestamp'] = pd.to_datetime(df['publication_timestamp'])
    df['publication_timestamp'] = df['publication_timestamp'].apply(lambda x: x.now().strftime('%Y-%m-%d'))
    df.to_excel(writer, sheet_name = city_name)

writer.save() # move this after you've finished writing to your writer object.

Листы в виде словарей

, если вам интересны внутренности класса, используйте .__dict__. для объекта, чтобы вы могли видеть метаданные.

writer = pd.ExcelWriter('file.xlsx')

df.to_excel(writer,sheet_name='Sheet1')
df.to_excel(writer,sheet_name='Sheet2')
print(writer.__dict__)

{'path': 'file.xlsx',
 'sheets': {'Sheet1': <xlsxwriter.worksheet.Worksheet at 0x11a05a79a88>,
  'Sheet2': <xlsxwriter.worksheet.Worksheet at 0x11a065218c8>},
 'cur_sheet': None,
 'date_format': 'YYYY-MM-DD',
 'datetime_format': 'YYYY-MM-DD HH:MM:SS',
 'mode': 'w',
 'book': <xlsxwriter.workbook.Workbook at 0x11a064ff1c8>}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...