Вставка/удаление строк/столбцов, перемещение диапазона ячеек
В материале рассказывается о методах модуля openpyxl , которые позволяют вставлять и удалять строки и столбцы листа электронной таблицы, а также перемещать диапазоны ячеек.
Содержание:
- Вставка строк и столбцов.
- Удаление строк и столбцов.
- Перемещение диапазона ячеек.
Вставка строк и столбцов.
Модуль openpyxl поддерживает вставку строк или столбцов. Чтобы произвести указанные действия, необходимо использовать соответствующие методы экземпляра рабочего листа Worksheet :
- Worksheet.insert_cols(idx, amount=1) : вставляет столбец или столбцы перед col==idx . Аргумент amount — количество добавляемых столбцов.
- Worksheet.insert_rows(idx, amount=1) : вставляет строку или строки перед row==idx . Аргумент amount — количество добавляемых строк.
По умолчанию вставляется одна строка или столбец. Например, чтобы вставить одну строку перед существующей 7-ой строкой необходимо вызвать ws.insert_rows(7) .
>>> from openpyxl import Workbook >>> wb = Workbook() >>> ws = wb.active # создадим произвольные данные >>> data = [[row*col for col in range(1, 16)] for row in range(1, 31)] # добавляем данные на активный лист >>> for row in data: . ws.append(row) . # вставим 3 новые строки перед # существующей 7-ой строкой >>> ws.insert_rows(7, 3) # сохраняем и смотрим >>> wb.save('test.xlsx')
Удаление строк и столбцов.
Что бы удалить строки или столбцы, используйте следующие методы экземпляра рабочего листа Worksheet :
- Worksheet.delete_cols() : удаляет столбец или столбцы, начиная с col==idx . Аргумент amount — количество удаляемых столбцов.
- Worksheet.delete_rows() : удаляет строку или строки, начиная с row==idx . Аргумент amount — количество удаляемых строк.
По умолчанию удаляется одна строка или столбец. Например, чтобы удалить столбцы в диапазоне F:H необходимо вызвать ws.delete_cols(6, 3) .
Пример — продолжение предыдущего:
# удалим 3 столбцы в диапазоне `F:H` >>> ws.delete_cols(6, 3) # сохраняемся и открываем файл >>> wb.save('test.xlsx')
Примечание. При вставке или удалении строк или столбцов модуль openpyxl не управляет зависимостями, такими как формулы, таблицы, диаграммы и т.д. Считается, что это выходит за рамки библиотеки, которая фокусируется на управлении форматом файла. В общем, клиентский код должен реализовывать необходимую функциональность в любом конкретном случае.
Перемещение диапазона ячеек.
Модуль openpyxl обеспечивает перемещение диапазонов ячеек внутри листа методом:
- Worksheet.move_range(cell_range, rows=0, cols=0, translate=False) .
Этот метод перемещает диапазон ячеек cell_range на количество строк rows и/или столбцов cols :
- вниз, если rows > 0 , и вверх, если rows < 0 ,
- вправо, если cols > 0 , и влево, если cols < 0 .
Существующие ячейки будут перезаписаны. Формулы и ссылки обновляться не будут.
>>> ws.move_range("D4:F10", rows=-1, cols=2)
Это приведет к перемещению ячеек в диапазоне ячеек D4:F10 вверх на одну строку и вправо на два столбца. Ячейки будут перезаписаны всеми существующими ячейками.
Если ячейки содержат формулы, то openpyxl может транслировать их, но, поскольку это не всегда то, что нужно, по этому этот функционал умолчанию отключен. Кроме того, будут транслированы только формулы в самих ячейках. Ссылки на ячейки из других ячеек или определенные имена обновляться не будут. Для этого можно использовать переводчик формул синтаксического анализа:
>>> ws.move_range("G4:H10", rows=1, cols=1, translate=True)
Это приведет к перемещению относительных ссылок в формулах в диапазоне на одну строку и один столбец.
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Встроенные в Excel формулы и модуль openpyxl
- Как установить формат в ячейку Excel модулем openpyxl
- Работа с форматированным текстом, модуль openpyxl
- Работа со стилями текста и ячеек, модуль openpyxl
- Как объединить/разъединить ячейки, модулем openpyxl
- Как изменить размеры строки/столбца модулем openpyxl
- Как закрепить строки/столбцы как шапку, модулем openpyxl
- Настройка печати/просмотра документа в Excel модулем openpyxl
- Вставка/удаление строк и столбцов, перемещение ячеек, модуль openpyxl
- Обработка больших файлов XLSX модулем openpyxl
- Работа с Pandas и поддержка NumPy, модуль openpyxl
- Проверка данных при заполнении ячеек, модуль openpyxl
- Именованные диапазоны ячеек в модуле openpyxl
- Работа с объектом Table() модуля openpyxl
- Защита книги и рабочего листа, модуля openpyxl
- Добавление изображений в XLSX-документ, модуль openpyxl
- Стиль ячеек по условию, модуль openpyxl
- Создание диаграмм средствами модуля openpyxl
- Класс Workbook() модуля openpyxl
- Объект Worksheet модуля openpyxl
- Объект ячейки Cell модуля openpyxl
- Функции преобразования ячеек модуля openpyxl
Как из Pandas Dataframe удалить столбец?
При работе с данными в Pandas, часто можно столкнуться с ситуацией, когда часть столбцов в Dataframe не содержат нужной нам информации и их требуется удалить, в этой статье мы рассмотрим несколько способов, как это можно сделать.
Сначала подготовим небольшой Dataframe, на основании которого будет делать все манипуляции.
import pandas as pd
city_data = ‘Город’:[‘Москва’, ‘Казань’, ‘Владивосток’, ‘Санкт-Петербург’, ‘Калининград’],
‘Дата основания’:[‘1147’, ‘1005’, ‘1860’, ‘1703’, ‘1255’],
‘Площадь’:[‘2511’, ‘516’, ‘331’, ‘1439’, ‘223’],
‘Население’:[‘11,9’, ‘1,2’, ‘0,6’, ‘4,9’, ‘0,4’],
‘Погода’:[‘8’, ‘8’, ’17’, ‘9’, ’12’] >
city_df = pd.DataFrame(city_data)
city_df
Основным методом, который нам предлагает Pandas для удаления столбцов, является метод drop.
Синтаксис у метода согласно документации следующий:
drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=’raise’), где:
- labels – номера или названия столбцов для удаления
- axis – значение 0, если вы хотите удалить строки, либо 1, если планируете удалять столбцы
- index – определяет, какие строки надо удалить
- columns – определяет, какие столбцы надо удалить
- inplace – изменяет оригинальный Dataframe, если параметр равен True
- errors – игнорируются ошибки, если параметр задан как ignore
Способ 1. Удаление столбца по его имени в Pandas
Укажите в методе drop название того столбца, что вы хотите удалить, а параметр axis сделайте равным 1:
city_df.drop(columns = [‘Население’],axis = 1)
Также мы можем удалить несколько столбцов по названию, для этого перечислите их через запятую внутри квадратных скобок:
city_df.drop(columns = [‘Население’, ‘Погода’], axis = 1)
Обратите внимание, что синтаксис выше не изменяет исходный Dataframe, если вы хотите это сделать, то добавьте параметр inplace=True
city_df.drop(columns = [‘Население’],axis = 1, inplace=True)
Способ 2. Удаление столбца по его порядковому номеру в Pandas
Мы можем удалить столбец, указывая не его имя, а его порядковый номер. Обратите внимание, что нумерация столбцов идет в Pandas с 0. К примеру мы хотим убрать столбец «Площадь», его порядковый номер – 2
city_df.drop(city_df.columns[[2]], axis = 1)
Этим же методом мы можем удалить несколько столбцов из Pandas, указав их через запятую. Уберем столбцы Площадь и Погода:
city_df.drop(city_df.columns[[2,3]], axis = 1)
Спасибо за внимание. В качестве бонуса прикладываю ноутбук к данной статье.
P.S. Рекомендую еще ознакомиться с нашей статьей «Как из Pandas удалить строку?».
Как удалить столбцы в Pandas
При работе с данными в Pandas мы можем удалить столбец (столбцы) или несколько строк из Pandas DataFrame. Столбцы/строки обычно удаляются, если они больше не нужны для дальнейшего изучения.
Есть несколько способов сделать это, но лучший способ в Pandas — использовать форму .drop(). DataFrame часто может содержать столбцы, которые не имеют отношения к исследованию. Такие столбцы следует удалить из DataFrame, чтобы мы могли сосредоточиться на оставшихся столбцах.
Столбцы можно опустить, определив имена меток и соответствующие оси или просто указав индекс или имена столбцов. Кроме того, метки на различных уровнях могут быть удалены с помощью мультииндекса путем определения уровня. В этой статье мы собираемся обсудить исключение столбцов в Pandas с некоторыми примерами.
Функция drop()
Функция drop() используется для удаления набора меток из строки или столбца. Мы также можем удалить один или несколько столбцов из DataFrame Python, используя функцию .drop().
Синтаксис
Синтаксис функции drop() может быть определен как:
DataFrame.drop(self, labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
Параметры
- Labels: строка или список имен столбцов или значение индекса строки.
- Index: для предоставления меток строк.
- Level: в случае MultiIndex DataFrame он используется для определения уровня, с которого должны быть удалены метки. Он принимает либо местоположение уровня, либо имя уровня в качестве входных данных.
- Axis: указывает, что столбцы или строки должны быть удалены. Чтобы удалить столбцы, установите для оси значение 1 или «columns». По умолчанию он удаляет строки из DataFrame.
- Columns: это альтернатива для axis = «columns». В качестве входных данных он принимает одну метку столбца или список меток столбца.
- Inplace: указывает, следует ли вернуть новый фрейм данных или изменить существующий. Это логический флаг со значением по умолчанию False.
- Errors: если установлено «ignore», игнорировать ошибки.
Returns
- Если inplace = True, он возвращает DataFrame с удаленными столбцами или None.
- Если метки не найдены, выдается KeyError.
Удаление одного столбца
DataFrame может потребовать удаления одного или сложного столбца.
Пример. Мы используем df.drop(columns = ‘имя столбца’) для удаления столбца “age” из DataFrame в приведенном ниже примере.
import pandas as pd student_dict = # Create DataFrame from dict student_df = pd.DataFrame(student_dict) print(student_df) # drop column student_df = student_df.drop(columns='age') print(student_df)
name age marks 0 Joe 20 85.1 1 Nat 21 77.8 name marks 0 Joe 85.1 1 Nat 77.8
Использование функции drop с axis = ‘column’ или axis = 1
Чтобы удалить столбцы, используйте параметр axis метода DataFrame.drop(). В качестве оси может использоваться строка или столбец. Ось столбца обозначается цифрой 1 или «столбцы». Установите axis=1 или axis= ‘columns’ и получите список имен столбцов, которые нужно удалить.
Пример: возьмем приведенный выше пример, чтобы понять, как мы можем использовать функцию drop() с axis = «column» и axis = 1.
student_df = student_df.drop(['age', 'marks'], axis='columns') # alternative both generates same result student_df = student_df.drop(['age', 'marks'], axis=1)
name age marks 0 Joe 20 85.1 1 Nat 21 77.8 name 0 Joe 1 Nat
Удаление нескольких столбцов
Есть два параметра параметров функции DataFrame.drop(), которые мы можем использовать для одновременного удаления нескольких столбцов DataFrame.
- Используйте параметр column, чтобы указать список имен столбцов, которые необходимо удалить.
- Установите axis на 1 и переместите список имен столбцов.
Пример. Давайте рассмотрим пример, чтобы понять, как мы можем удалить несколько столбцов в DataFrame.
import pandas as pd student_dict = student_df = pd.DataFrame(student_dict) print(student_df.columns.values) # drop 2 columns at a time student_df = student_df.drop(columns=['age', 'marks']) print(student_df.columns.values)
name age marks 0 John 24 77.29 1 Alex 18 69.15 name 0 John 1 Alex
Перемещение столбца на место
В предыдущих случаях всякий раз, когда мы выполняли процедуру удаления, Pandas генерировал новую копию DataFrame, потому что модификации не было на месте. Параметр inplace указывает, следует ли удалить столбец из существующего фрейма данных или сделать его копию.
- Если inplace=True, он обновляет текущий DataFrame, ничего не возвращая.
- Если для параметра inplace установлено значение False, он создает новый фрейм данных с обновленными изменениями и возвращает его.
Пример: объясним, как мы можем использовать функцию drop, чтобы переместить столбец на место.
import pandas as pd student_dict = student_df = pd.DataFrame(student_dict) print(student_df.columns.values) # drop columns in place student_df.drop(columns=['age', 'marks'], inplace=True) print(student_df.columns.values)
name age marks 0 John 24 79.18 1 Alex 18 68.79 name 0 John 1 Alex
Принятие или игнорирование ошибок
Если столбец, который мы пытаемся удалить, не существует в наборе данных, метод DataFrame.drop() выдает ошибку KeyError. Если мы просто хотим удалить столбец, если это произойдет, мы можем использовать параметр Errors, чтобы удалить ошибку.
- Установите errors= ‘ignore’, чтобы предотвратить возникновение ошибок.
- Установите errors= ‘raised’, чтобы сгенерировать KeyError для неизвестных столбцов.
Пример: Рассмотрим пример, чтобы понять, как мы можем удалить столбцы, подавляя ошибки.
import pandas as pd student_dict = # Create DataFrame from dict student_df = pd.DataFrame(student_dict) print(student_df) # supress error student_df = student_df.drop(columns='salary', errors='ignore') # No change in the student_df # raise error student_df = student_df.drop(columns='salary') # KeyError: "['salary'] not found in axis"
Вывод: после выполнения приведенного выше кода мы получим вывод, как показано ниже:
name age marks 0 John 24 79.49 1 Alex 18 82.54 raise KeyError(f" not found in axis") KeyError: "['salary'] not found in axis"
Удаление по позиции индекса
Если мы хотим удалить столбцы из DataFrame, но не знаем их имен, мы можем сделать это, удалив столбец, используя его индексную позицию. Индексация столбца начинается с 0 (ноль) и продолжается до последнего столбца, значение индекса которого равно len(df.columns)-1.
Удалить первые n столбцов
Мы можем использовать DataFrame.iloc и функцию range() Python, чтобы определить диапазон столбцов, если нам нужно удалить первые n столбцов из DataFrame. С параметром столбцов DataFrame.drop() нам необходимо использовать встроенную функцию range().
Пример. Давайте рассмотрим пример, чтобы понять, как мы можем удалить первые n столбцов в DataFrame.
import pandas as pd student_dict = # Create DataFrame from dict student_df = pd.DataFrame(student_dict) print(student_df.columns.values) # drop column 1 and 2 student_df = student_df.drop(columns=student_df.iloc[:, range(2)]) # print only columns print(student_df.columns.values)
name age marks class city 0 John 24 84.45 A US 1 Alex 18 76.11 B UK marks class city 84.45 A US 76.11 B UK
Удалить последний столбец
Предположим, что мы хотим исключить первый или последний столбец DataFrame без использования имени столбца. В таких ситуациях используйте атрибут DataFrame.columns для удаления столбца DataFrame на основе его расположения в индексе. Просто переместите df.columns[index] в параметр столбцов DataFrame.drop().
import pandas as pd student_dict = # Create DataFrame from dict student_df = pd.DataFrame(student_dict) print(student_df.columns.values) # find position of the last column and drop pos = len(student_df.columns) - 1 student_df = student_df.drop(columns=student_df.columns[pos]) print(student_df.columns.values) # delete column present at index 1 # student_df.drop(columns = student_df.columns[1])
name age marks 0 John 24 68.44 1 Alex 18 85.67 name age 0 John 24 1 Alex 18
Исключение диапазона столбцов с помощью iloc
Возможно, нам потребуется исключить четвертый столбец из набора данных или группу столбцов вообще. DataFrame.iloc можно использовать для выбора одного или нескольких столбцов из DataFrame. Чтобы определить индексное расположение столбцов, которые необходимо удалить, мы можем использовать DataFrame.iloc в параметре столбца.
Пример: Давайте рассмотрим пример, чтобы понять, как мы можем удалить диапазон столбцов с помощью функции iloc.
import pandas as pd student_dict = # Create DataFrame from dict student_df = pd.DataFrame(student_dict) print(student_df.columns.values) # drop column from 1 to 3 student_df = student_df.drop(columns=student_df.iloc[:, 1:3]) print(student_df.columns.values)
name age marks 0 John 24 79.64 1 Alex 18 86.84 name 0 John 1 Alex
Исключение из мультииндексных фреймов данных
DataFrame с несколькими заголовками столбцов называется мультииндексным DataFrame. Такие заголовки делятся на уровни, где уровень 0 является первым, уровень 1 — вторым и т. д.
Столбец может быть удален из любого этапа мультииндексного DataFrame. По умолчанию он удаляет столбцы со всех уровней, но мы можем использовать уровень параметра, чтобы удалить столбцы только с одного уровня. Мы должны передать имя уровня как уровень = индекс уровня.
import pandas as pd # create column header col = pd.MultiIndex.from_arrays([['Class X', 'Class Y', 'Class Z', 'Class Y'], ['Name', 'Marks', 'Name', 'Marks']]) # create DataFrame from 2darray student_df = pd.DataFrame([['John', '87.22', 'Nat', '68.79'], ['Peter', '73.45', 'Alex', '82.76']], columns=col) print(student_df) # drop column student_df = student_df.drop(columns=['Marks'], level=1) print(student_df)
Class X Class Y Class Z Class Y Name Marks Name Marks 0 John 87.22 Nat 68.79 1 Peter 73.45 Alex 82.76 Class X Class Z Name Name 0 John Nat 1 Peter Alex
Использование функции
Мы также можем использовать функцию для удаления столбцов на основе некоторой логики или условия. Чтобы удалить столбцы, мы можем использовать как встроенные, так и пользовательские функции.
pandas DataFrame.pop()
Если мы просто хотим удалить один столбец, мы можем использовать функцию DataFrame.pop(col label). Нам необходимо передать метку столбца, которую необходимо удалить. Обновляя существующий DataFrame, он удаляет столбец на месте. Если столбец не найден, возникает ошибка KeyError.
import pandas as pd student_dict = # Create DataFrame from dict student_df = pd.DataFrame(student_dict) print(student_df) # drop column student_df.pop('age') print(student_df)
name age marks 0 John 24 62.46 1 Alex 18 54.21 name marks 0 John 62.46 1 Alex 54.21
DataFrame.loc
Если мы хотим удалить все столбцы из DataFrame, мы можем сделать это быстро и легко с помощью DataFrame.loc в параметре столбца DataFrame.drop(). Метки столбцов, которые необходимо удалить, определяются с помощью DataFrame.loc. Если метки столбцов не определены, например df.loc[:], DataFrame будет удален из всех столбцов.
import pandas as pd student_dict = # Create DataFrame from dict student_df = pd.DataFrame(student_dict) print(student_df.columns.values) # drop column 1 and 2 student_df = student_df.drop(columns=student_df.loc[:]) # print only columns print(student_df.columns.values)
name age marks 0 John 24 79.68 1 Alex 18 84.45
Функция delete
Чтобы удалить один столбец из DataFrame, мы могли бы использовать встроенную функцию pandas del. Это очень упрощенный метод удаления столбца из DataFrame. Мы должны выбрать удаляемый столбец DataFrame и передать его как del df[col label].
import pandas as pd student_dict = # Create DataFrame from dict student_df = pd.DataFrame(student_dict) print(student_df) # drop column del student_df['age'] print(student_df)
name age marks 0 John 23 57.88 1 Alex 22 78.84 name marks 0 John 57.88 1 Alex 78.84
Удаление пустых столбцов в таблице
Скрипт
Код работает, если нет объединённых ячеек в таблице.
Код работает с таблицей, в которой находится курсор.
Для ускорения работы кода можно попробовать перейти в режим «Черновик» (Word 2010) и отключить проверку правописания.
Sub Procedure_1() '1. Помещаем в константу "myHeader" фрагмент заголовка
'столбцов, которые нас интересуют.
Const myHeader As String = "Семестр"
Dim myTable As Word.Table
Dim myLen As Long
Dim i As Long, j As Long
'2. Даём таблице, в которой находится курсор, VBA-имя "myTable".
'Через это имя будем обращаться к этой таблице. Так удобнее писать код.
Set myTable = Selection.Tables(1)
'3. Берём в переменную "myLen" количество символов,
'которое во фрагменте заголовка, чтобы каждый раз
'не вызывать функцию "Len" (может это ускорит работу кода).
myLen = Len(myHeader)
'В цикле с "i" двигаемся по ячейкам первой строки таблицы.
'Когда что-то удаляем, то удобнее писать код, если
'двигаться с конца в начало, т.к. порядковые номера
'элементов меняются.
For i = myTable.Columns.Count To 1 Step -1
'Если в ячейке в начале ячейки есть слово "Семестр",
'то анализируем остальные ячейки столбца.
If Left(myTable.Cell(1, i).Range.Text, myLen) = myHeader Then
'В цикле с "j" двигаемся по ячейкам столбца.
For j = 2 To myTable.Rows.Count Step 1
'В каждой Word-ячейке есть всегда два символа:
'1) символ "Конец ячейки" (его видно, если включен
'режим отображения непечатаемых символов (он круглый));
'2) символ, которого вообще не видно никогда.
'Characters учитывает символ "Конец ячейки".
'Если в ячейке больше одного символа, значит ячейка не пустая.
If myTable.Cell(j, i).Range.Characters.Count > 1 Then
'Переходим к следующему столбцу.
GoTo metka
End If
Next j
'Если код дошёл до сюда, значит все ячейки
'в столбце просмотрены и все ячейки пустые.
'Удаляем столбец.
myTable.Columns(i).Delete
End If
metka:
Next i
End Sub
Похожие статьи
- Макрос, который находит повторяющийся текст при его вводе и выводит окно предупреждения
- Как в операторе автофильтра указать, что выбираются выбираются все значения, кроме нуля?
- Удалить кривую из графика
- Как создать макрос, который бы вставлял слово по первой набранной букве?
- Как в Word сделать элементы управления невидимыми для печати?
- Запуск макроса в открытом на данный момент Word
- Как макросом брать данные с word документов в excel?
- Срабатывание разных макросов при изменении разных диапазонов на листе
- Открыть несколько книг excel из одной папки с одинаковым расширением
- Копирование части текста (выделенного полужирным) из ячейки
