Как записать динамическое имя файла to_excel в цикл for на основе поля groupby в PANDAS? - PullRequest
1 голос
/ 05 июня 2019

У меня есть набор данных школ в каждом штате. Я хочу сгруппировать школы по штатам, выполнить некоторые вычисления для создания рейтинга, а затем экспортировать каждый рейтинг в отдельные файлы .xlsx с именем «state.xlsx». Например, данные о школах АК в файл Ranking_alaska.xlsx, школы ТХ в файл Ranking_texas.xlsx и т. Д.

Пример данных здесь: https://docs.google.com/spreadsheets/d/1-wdmIz_-AILcBqzvpwAFGZfXqhq8oDRrYFVVdkjZ10o/edit?usp=sharing

Я попытался объединить поле состояния с именем файла, но я получил TypeError: могу только объединить str (не "tuple") в str. Когда я запускаю код со статическим именем файла, он создает файл только для состояния в первой строке данных.


df = pd.read_excel("ranker_test.xlsx", sheet_name='DATA')

grouped = df.groupby('state')

for x in grouped:
    df.to_excel('test files/ranking_' + x + '.xlsx', index=False)

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

EDIT: Я использовал ввод Reedinator для создания имен файлов, но у меня были проблемы с экспортом каждой группы, чтобы преуспеть. Он либо возвращает весь файл данных всех групп в каждый файл, либо не выполняется. Это мой код:

for group in grouped:
    group.to_frame().to_excel('test files/ranking_{}.xlsx'.format(group[0]), index=False)

Но я получаю AttributeError: у объекта 'tuple' нет атрибута 'to_frame'

Как я могу преобразовать кортеж в DataFrame для отправки в Excel?

1 Ответ

1 голос
/ 06 июня 2019

Ошибка говорит вам очень простое объяснение того, почему она не работает -> x это кортеж и не a строка ! Лично я бы попытался распечатать его и убедиться, что это действительно то, что я хочу:

for x in grouped:
    print(x)

Это покажет вам что-то вроде (item0, item1, item2, ..., itemN)

Теперь вы можете выбрать, какой элемент является искомой строкой:

for x in grouped:
    df.to_excel('test files/ranking_{}.xlsx'.format(x[0]), index=False)

Где x[0] скажет ему получить item0 (в идеале - строку, но вы также можете привести ее к одной, как показано ниже). В качестве альтернативы вы можете создать имя файла, например test files/ranking_(item0, item1, item2, ..., itemN).xlsx (используя строковое представление кортежа), например:

for x in grouped:
    df.to_excel('test files/ranking_{}.xlsx'.format(x), index=False)

Следует отметить, что метод .format() неявно вызывает функцию str(), когда это необходимо, хотя (поскольку .format() отличается от конкатенации и обычно намного чище для чтения, быстрее для запуска и просто вообще лучше чем конкатенация). Если вы действительно хотите использовать конкатенацию, вам просто нужно сделать из нее строку:

for x in grouped:
    df.to_excel('test files/ranking_' + str(x) + '.xlsx', index=False)

Но, пожалуйста, перейдите на .format() !! Если у вас есть более новая версия python, вы можете даже перейти к последней и самой лучшей f строк

Также кажется, что вы должны рассмотреть pandas функция группового режима

Их пример заставляет меня поверить, что вам нужно:

for name, group in grouped:
    group.to_excel('test files/ranking_{}.xlsx'.format(name), index=False)

Однако я не эксперт по pandas и не проверял это, чтобы быть точным.

...