Pandas ширина столбца в excel

Обновлено: 03.07.2024

Новичок - у меня есть скрипт Python, который регулирует ширину разных столбцов файла Excel в соответствии с указанными значениями:

Есть ли способ, с помощью которого мы можем отрегулировать ширину каждого столбца до его наиболее оптимального значения, без явного указания его для разных столбцов (значит, без использования этого " if-elif-elif -. - elif-else "структура)? Благодарность!

4 ответа

Это, вероятно, можно сделать аккуратнее, но это делает работу. Вы можете поиграть со значением Adjust_width в соответствии с тем, что хорошо для шрифта, который вы используете при его просмотре. Если вы используете монотип, вы можете получить его точно, но это не взаимно-однозначная корреляция, поэтому вам все равно придется немного его скорректировать.

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

Изменить: На самом деле, кажется, есть лучший способ измерения визуального размера текста: ссылка лично я предпочел бы метод matplotlib.

Надеюсь, что смогу помочь, мой самый первый ответ на stackoverflow =)

У меня проблема с merged_cells, и авторазмер не работает правильно, если у вас есть та же проблема, вы можете решить, добавив следующие строки в код oldsea

Обновленная версия от openpyxl 3.0.0 (использование .columns не удается с TypeError: expected <class 'str'> :

Если возможно, вы должны определить длину самой длинной записи в столбце и использовать ее для установки ширины.

Я предполагаю, что вы можете использовать для записи в ascii_uppercase.

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

Excel — это чрезвычайно распространённый инструмент для анализа данных. С ним легко научиться работать, есть он практически на каждом компьютере, а тот, кто его освоил, может с его помощью решать довольно сложные задачи. Python часто считают инструментом, возможности которого практически безграничны, но который освоить сложнее, чем Excel. Автор материала, перевод которого мы сегодня публикуем, хочет рассказать о решении с помощью Python трёх задач, которые обычно решают в Excel. Эта статья представляет собой нечто вроде введения в Python для тех, кто хорошо знает Excel.




Загрузка данных

Начнём с импорта Python-библиотеки pandas и с загрузки в датафреймы данных, которые хранятся на листах sales и states книги Excel. Такие же имена мы дадим и соответствующим датафреймам.


Теперь воспользуемся методом .head() датафрейма sales для того чтобы вывести элементы, находящиеся в начале датафрейма:


Сравним то, что будет выведено, с тем, что можно видеть в Excel.


Сравнение внешнего вида данных, выводимых в Excel, с внешним видом данных, выводимых из датафрейма pandas

Тут можно видеть, что результаты визуализации данных из датафрейма очень похожи на то, что можно видеть в Excel. Но тут имеются и некоторые очень важные различия:

  • Нумерация строк в Excel начинается с 1, а в pandas номер (индекс) первой строки равняется 0.
  • В Excel столбцы имеют буквенные обозначения, начинающиеся с буквы A , а в pandas названия столбцов соответствуют именам соответствующих переменных.

Реализация возможностей Excel-функции IF в Python

В Excel существует очень удобная функция IF , которая позволяет, например, записать что-либо в ячейку, основываясь на проверке того, что находится в другой ячейке. Предположим, нужно создать в Excel новый столбец, ячейки которого будут сообщать нам о том, превышают ли 500 значения, записанные в соответствующие ячейки столбца B . В Excel такому столбцу (в нашем случае это столбец E ) можно назначить заголовок MoreThan500 , записав соответствующий текст в ячейку E1 . После этого, в ячейке E2 , можно ввести следующее:

Использование функции IF в Excel

Для того чтобы сделать то же самое с использованием pandas, можно воспользоваться списковым включением (list comprehension):


Списковые включения в Python: если текущее значение больше 500 — в список попадает Yes, в противном случае — No

Списковые включения — это отличное средство для решения подобных задач, позволяющее упростить код за счёт уменьшения потребности в сложных конструкциях вида if/else. Ту же задачу можно решить и с помощью if/else, но предложенный подход экономит время и делает код немного чище. Подробности о списковых включениях можно найти здесь.

Реализация возможностей Excel-функции VLOOKUP в Python

В нашем наборе данных, на одном из листов Excel, есть названия городов, а на другом — названия штатов и провинций. Как узнать о том, где именно находится каждый город? Для этого подходит Excel-функция VLOOKUP , с помощью которой можно связать данные двух таблиц. Эта функция работает по принципу левого соединения, когда сохраняется каждая запись из набора данных, находящегося в левой части выражения. Применяя функцию VLOOKUP , мы предлагаем системе выполнить поиск определённого значения в заданном столбце указанного листа, а затем — вернуть значение, которое находится на заданное число столбцов правее найденного значения. Вот как это выглядит:


Зададим на листе sales заголовок столбца F как State и воспользуемся функцией VLOOKUP для того чтобы заполнить ячейки этого столбца названиями штатов и провинций, в которых расположены города.

Использование функции VLOOKUP в Excel

В Python сделать то же самое можно, воспользовавшись методом merge из pandas. Он принимает два датафрейма и объединяет их. Для решения этой задачи нам понадобится следующий код:

  1. Первый аргумент метода merge — это исходный датафрейм.
  2. Второй аргумент — это датафрейм, в котором мы ищем значения.
  3. Аргумент how указывает на то, как именно мы хотим соединить данные.
  4. Аргумент on указывает на переменную, по которой нужно выполнить соединение (тут ещё можно использовать аргументы left_on и right_on , нужные в том случае, если интересующие нас данные в разных датафреймах названы по-разному).

Сводные таблицы

Сводные таблицы (Pivot Tables) — это одна из самых мощных возможностей Excel. Такие таблицы позволяют очень быстро извлекать ценные сведения из больших наборов данных. Создадим в Excel сводную таблицу, выводящую сведения о суммарных продажах по каждому городу.

Создание сводной таблицы в Excel

Как видите, для создания подобной таблицы достаточно перетащить поле City в раздел Rows , а поле Sales — в раздел Values . После этого Excel автоматически выведет суммарные продажи для каждого города.

Для того чтобы создать такую же сводную таблицу в pandas, нужно будет написать следующий код:

  1. Здесь мы используем метод sales.pivot_table , сообщая pandas о том, что мы хотим создать сводную таблицу, основанную на датафрейме sales .
  2. Аргумент index указывает на столбец, по которому мы хотим агрегировать данные.
  3. Аргумент values указывает на то, какие значения мы собираемся агрегировать.
  4. Аргумент aggfunc задаёт функцию, которую мы хотим использовать при обработке значений (тут ещё можно воспользоваться функциями mean , max , min и так далее).

Итоги

Из этого материала вы узнали о том, как импортировать Excel-данные в pandas, о том, как реализовать средствами Python и pandas возможности Excel-функций IF и VLOOKUP , а также о том, как воспроизвести средствами pandas функционал сводных таблиц Excel. Возможно, сейчас вы задаётесь вопросом о том, зачем вам пользоваться pandas, если то же самое можно сделать и в Excel. На этот вопрос нет однозначного ответа. Python позволяет создавать код, который поддаётся тонкой настройке и глубокому исследованию. Такой код можно использовать многократно. Средствами Python можно описывать очень сложные схемы анализа данных. А возможностей Excel, вероятно, достаточно лишь для менее масштабных исследований данных. Если вы до этого момента пользовались только Excel — рекомендую испытать Python и pandas, и узнать о том, что у вас из этого получится.

Как сделать автоматическую настройку ширины столбцов или хотя бы задать фиксированную ширину в pandas ?

Что я пробовала:

не помогло.

Фрагмент кода из статьи:

не помогло.

Но очень громоздкий и у меня выдаёт ошибку:

В строке header = df[[i]].astype(str).columns.values .

И как установить размер шрифта и сам шрифт для всех столбцов с заголовками? Вот как я устанавливаю размер шрифта и центрирование для столбцов:

Но для заголовков это не применяется:

введите сюда описание изображения

Вы где эту ширину хотите выставить, при выводе куда-то или при экспорте в эксель или где вообще? Вы можете ответить на вопрос - где вы эту ширину смотрите, каким образом? Выводите на экран, экспортируете в эксель? Потому что это совсем разные истории вообще.

Тут статью посмотрите, должно помочь. Вот текст оттуда:

Как автоматически настроить ширину столбцов Excel с помощью Pandas ExcelWriter Динамическая настройка ширины имен столбцов Excel при использовании pandas.ExcelWriter и Python

Теперь давайте попробуем записать pandas DataFrame, который мы только что создали, в csv-файл, используя ExcelWriter , как показано ниже (обратите внимание, что если приведенный ниже фрагмент не работает, ModuleNotFoundError: No module named openpyxl. Все, что вам нужно сделать, это установить библиотеку, запустив pip install openpyxl`):

Написание pandas DataFrame в электронную таблицу Excel Выходная электронная таблица должна выглядеть примерно так, как показано ниже. Как видите, столбцы с более длинными именами обрезаются, а таблица в целом выглядит ужасно. Проблема была бы еще больше, если бы вам пришлось иметь дело с большим количеством таких столбцов.

Вывести pandas DataFrame в электронную таблицу Excel В следующих разделах мы рассмотрим несколько возможных способов автоматической регулировки ширины столбцов, чтобы итоговая таблица в электронной таблице была более читаемой. Динамически настраивайте ширину всех столбцов Чтобы автоматически регулировать ширину столбцов в зависимости от их длины, нам просто нужно выполнить итерацию по столбцам и соответственно установить ширину столбца, как показано ниже:

Примечание. Если приведенный ниже фрагмент не соответствует следующему AttributeError, перейдите в конец статьи, чтобы узнать, как можно быстро решить эту проблему.

Теперь выходной фрейм данных pandas в электронной таблице Excel стал более читаемым и определенно выглядит лучше. Все столбцы настроены на соответствующую ширину, чтобы они вписывались в пространство без обрезки.

Вывести pandas DataFrame в электронную таблицу Excel с автоматически настраиваемой шириной столбцов Отрегулируйте ширину столбца, используя его имя Теперь есть шанс, что вы захотите вручную настроить ширину только для определенного столбца (или подмножества столбцов). Вы можете сделать это, указав имя столбца, как показано во фрагменте ниже. Для этого примера предположим, что мы хотим настроить ширину столбца this_is_a_long_column_name на 30:

Ручная настройка ширины определенного столбца путем ссылки на его имя Результат приведенного выше фрагмента показан ниже. Как мы видим, ширина столбца this_is_a_long_column_name была скорректирована 20, а ширина оставшихся столбцов была скорректирована до значения по умолчанию, что позволяет обрезать столбцы с большей шириной (например, последний).

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

Ручная настройка ширины определенного столбца путем ссылки на его индекс Опять же, мы видим, что в этом случае последний столбец был настроен width=40 так, чтобы он был достаточно широким, чтобы соответствовать имени столбца.

все, что вам нужно сделать, это установить xlswriter :

Заключение

В этой статье мы исследуем несколько возможных способов автоматической регулировки ширины столбцов при записи pandas DataFrame в электронные таблицы Excel. Обычно мы создаем электронные таблицы, чтобы генерировать элементы информации, которые выглядят красиво и легко читаются. Поэтому важно создавать электронные таблицы, которые не потребуют от читателя каких-либо ручных усилий, чтобы сделать их удобочитаемыми. Вы можете добиться этого с помощью минимального кода, который я поделился ранее, который определенно поможет вам создавать высококачественные файлы Excel при попытке создать их из pandas DataFrames.

Прямо сейчас я пытаюсь запустить простой код, который просматривает тысячи листов Excel и извлекает данные. Я использую Python 3.7 с пакетами Pandas и Glob. Код прост, как показано ниже:

Однако это дает мне ошибку типа. TypeError: Fill() takes no arguments

К сожалению, у меня нет возможности выполнить это редактирование вручную. У кого-нибудь есть опыт работы с этим?

Заранее спасибо, Дэн

Обновление с использованием информации из файла Excel: Расширение файла: «.xlsx» Ссылка: Ссылка на файл Excel

1 ответ

Вы можете использовать старую версию xlrd .

Но сначала прочтите предупреждение ниже, вы должны ДОВЕРЯТЬ своим данным, чтобы они были в безопасности. Если вы знаете, что данные, которые вы используете, поступают из надежного источника, вы можете использовать их, пока ваша версия xlrd находится в виртуальной среде (см. Anaconda), чтобы вы не использовали ее для открытия небезопасных файлов по ошибке 2 года спустя.

Реплицировал баг оп. Вот что я обнаружил: я и op выполнили инструкции и установили openpyxl.

Здесь expected_type () может быть float или datetime, например

Но вместо этого мы получаем <class 'openpyxl.styles.fills.Fill'> Таким образом, он пытается привести значение, подобное этому:

Что не имеет смысла! > :(

Похоже, что openpyxl считывает ширину столбца и обнаруживает, что столбец слишком мал для отображения значения. Таким образом, он использует метод FILL, чтобы заполнить пространство знаком «XXXX», чтобы указать на нехватку места .

Что не работает:

  • установка параметра usecols , чтобы избежать загрузки столбца даты
  • установка параметра dtype для принудительного использования типа str
  • пытаюсь преобразовать файл с помощью openpyxl

Следующее преобразование не выполняется:

Не переключайте старую версию xlrd (движок) для чтения ваших файлов xlsx. У старого движка есть проблемы с безопасностью!

Причина, по которой поддержка xlsx была удалена, заключается в том, что в нем были потенциальные уязвимости безопасности, и никто не поддерживал его. Если вы выберете этот подход, а не тривиальный переход на openpyxl, вы рискуете столкнуться с ними.

Читайте также: