Pandas Groupby - перечислять через Dataframe и копировать в новые уникальные таблицы Excel - PullRequest
0 голосов
/ 20 марта 2020

Итак, данные на связанном рисунке ниже находятся на одном листе в книге Excel, которая была создана путем добавления нескольких файлов Excel вместе с использованием Pandas (я добавил первый столбец «Строка #» для иллюстрации только для целей).

Изображение моего набора данных: Я пытаюсь перечислить уникальные комбинации «Год» и «Сценарий» и скопировать эти данные в новую рабочую книгу. , Кроме того, в этой новой книге я хочу создать уникальный лист для каждой уникальной комбинации вместе со всеми ее данными.

Например, будет создана новая рабочая книга Excel, первая вкладка в этой рабочей книге будет называться «Фактические данные за 2020 год», и эта рабочая таблица будет содержать ТОЛЬКО первую строку на рисунке выше (где год = 2020 и Сценарий = Фактические). Он также будет включать все заголовки на снимке экрана выше, а также для каждого нового листа. Следующая рабочая таблица в этой же рабочей книге будет называться «План 2020 года» и будет содержать строки 2–5. Третья рабочая таблица будет называться «Fcsst 2020» и включать только строки 6 и 7 (и включать заголовки). И так далее, и так далее.

Поэтому я пытаюсь создать уникальные рабочие листы для каждой конкретной c комбинации / объединения столбцов "Год" и "Сценарий". Я не пытаюсь каким-либо образом поворачивать, суммировать или агрегировать значения в столбцах «январь» или «февраль». Просто пытаюсь нарезать каждую уникальную комбинацию Год-Сценарий на новый лист Excel. Я знаю, что это можно сделать с помощью группы "for l oop" и pandas, но не совсем понимаю.

Это насколько я понял, но получаю эту ошибку -> Ошибка типа: ожидаемая строка или байтовоподобный объект

writer = pd.ExcelWriter('test2.xlsx')
grouped = combined.groupby(['Year','Scenario'])

for name, group in grouped:
    group.to_excel(writer, sheet_name=name)
writer.save

1 Ответ

0 голосов
/ 20 марта 2020

Вам не нужно группировать, чтобы сделать это, просто нужно отфильтровать набор данных. (Если вам нужно сгруппировать, чтобы получить агрегаты, сначала сделайте это, а затем начните с нижеуказанного.)

Вам также необходимо установить xlsxwriter, используя pip install xlsxwriter

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

import pandas as pd
import random

# Create randomized dataframe
df = pd.DataFrame({'Year':[random.choice(['2010', '2011', '2012']) for _ in range(100)],
                   'Scenario':[random.choice(['Plan', 'Actuals', 'Fcsst']) for _ in range(100)],
                   'Val':list(range(0, 100))})

# You can sort values here if you want, but you don't have to
df = df.sort_values(['Year', 'Scenario'])
df.head()

    Year Scenario  Val
5   2010  Actuals    5
14  2010  Actuals   14
31  2010  Actuals   31
64  2010  Actuals   64
69  2010  Actuals   69

# Define your list of unique concatenations of Year and Scenario.
unique_ys = df[['Year', 'Scenario']].drop_duplicates().values.tolist()
#or
unique_ys = list(df.groupby(['Year', 'Scenario']).groups)
unique_ys

[('2010', 'Actuals'),
 ('2010', 'Fcsst'),
 ('2010', 'Plan'),
 ('2011', 'Actuals'),
 ('2011', 'Fcsst'),
 ('2011', 'Plan'),
 ('2012', 'Actuals'),
 ('2012', 'Fcsst'),
 ('2012', 'Plan')]

# Initialize a writer object, and determine the filename
writer = pd.ExcelWriter('finance_file.xlsx', engine='xlsxwriter')

# Iterate through unique concatenations, filter the datasets and write them to each sheet.
for list_ in unique_ys:
    df[(df.Year == list_[0]) & (df.Scenario == list_[1])].to_excel(writer, 
                                                                   sheet_name=list_[0]+' '+list_[1], 
                                                                   index=False)

# Close the Pandas Excel writer and output the Excel file.
writer.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...