Удалить строку в excel pandas
Специалисты по обработке данных тратят много времени на очистку наборов данных и приведение их в форму, с которой они могут работать. Фактически, многие специалисты по данным утверждают, что начальные шаги по получению и очистке данных составляют 80% работы. Именно об этом мы и поговорим в данной главе. Но перед этим, нам необходимо установить и импортировать две библиотеки:
Кроме этого, в проекте мы создаем папку Datasets, куда размещаем наши исходные файлы, с которыми будет происходить работа. В моем случае это: BL-Flickr-Images-Book.csv, olympics.csv и university_towns.txt. Проделав все эти действия, можно приступать к работе.
Удаление столбцов в DataFrame
Часто вы обнаруживаете, что не все категории данных в наборе данных вам нужны. Именно поэтому, библиотека Pandas предоставляет удобный способ удаления ненужных столбцов или строк из DataFrame с помощью функции drop(). Давайте посмотрим на простой пример, в котором мы удаляем несколько столбцов из DataFrame. В приведенных ниже примерах мы передаем относительный путь к pd.read_csv, что означает, что все наборы данных находятся в папке с именем Datasets в нашем текущем рабочем каталоге:
Результат:
Сделав вывод нашего csv файла мы видим, что несколько столбцов предствляют собой вспомогательную информацию, которая была бы полезна для библиотеки, но не очень для описания самой книги: Edition Statement, Corporate Author, Corporate Contributors, Former owner, Engraver, Issuance type и Shelfmarks. Эту информацию мы можем удалить следующим образом:
Сначала мы определили список, который содержит имена всех столбцов, которые мы хотим удалить. Затем мы вызываем функцию drop() для нашего объекта, передавая параметр inplace как True и параметр оси как 1, что говорит Pandas об изменениях непосредственно в нашем объекте и что он должен искать значения, которые будут отброшены в столбцах объекта. Результат:
Изменение индекса фрейма данных
Индекс Pandas расширяет функциональность массивов NumPy, чтобы обеспечить более гибкое нарезание и маркировку. Во многих случаях полезно использовать однозначное идентифицирующее поле данных в качестве индекса. Давайте заменим существующий индекс в BL-Flickr-Images-Book.csv столбцом Identifier, используя set_index:
Результат:
Кроме этого, мы можем получить доступ к каждой записи простым способом с помощью loc[]. Хотя loc[] может не иметь всего этого интуитивно понятного имени, он позволяет нам выполнять индексацию на основе меток, которая представляет собой маркировку строки или записи независимо от ее положения:
Результат:
Другими словами, 206 — это первая метка индекса. Ранее нашим индексом был RangeIndex: целые числа, начинающиеся с 0, аналог встроенного диапазона Python. Передав имя столбца в set_index, мы изменили индекс на значения в Identifier.
Очистка полей в данных
Пока что мы удалили ненужные столбцы и изменили индекс нашего DataFrame на что-то более разумное. В этом разделе мы очистим определенные столбцы и приведем их к единому формату, чтобы лучше понять набор данных и обеспечить согласованность. В частности, мы будем очищать дату публикации и место публикации. Давайте выведем поле, содержащее дату публикации, чтобы мы могли выполнять вычисления в будущем:
Результат:
Как известно, у конкретной книги может быть только одна дата публикации. Поэтому нам необходимо удалить лишние даты в квадратных скобках, преобразовать диапазоны дат в их «дату начала», полностью удалить даты, в которых мы не уверены и преобразовать строку nan в значение NaN NumPy. Для этого мы будем использовать следующее регулярное выражение: regex = r'^(\d)'. Данное выражение предназначено для поиска любых четырех цифр в начале строки, чего достаточно для нашего случая. Это необработанная строка, что является стандартной практикой с регулярными выражениями. \d представляет любую цифру, а повторяет это правило четыре раза. Символ ^ соответствует началу строки, а круглые скобки обозначают группу захвата, которая сигнализирует Pandas, что мы хотим извлечь эту часть регулярного выражения. Сам код:
Результат:
Объединение методов str с NumPy для очистки столбцов
Для начала, давайте выведем содержимое столбца Place of Publication:
Результат:
Мы видим, что для некоторых строк место публикации окружено другой ненужной информацией. Если бы мы посмотрели на большее количество значений, мы бы увидели, что это справедливо только для некоторых строк, место публикации которых — ‘London’ или ‘Oxford’. Давайте взглянем на две конкретные записи:
Результат:
Эти две книги были изданы в одном месте, но одна имеет дефис в названии места, а другая — нет. Чтобы очистить этот столбец за один проход, мы можем использовать str.contains() для получения логической маски. Чистим колонку следующим образом:
Результат:
Здесь функция np.where вызывается во вложенной структуре с условием, представляющим собой серию логических значений, полученных с помощью str.contains(). Метод contains() работает аналогично встроенному ключевому слову in, используемому для поиска вхождения объекта в итерируемом объекте (или подстроке в строке). Используемая замена — это строка, представляющая желаемое место публикации. Мы также заменяем дефисы пробелом с помощью str.replace() и переназначаем столбец в нашем DataFrame.
Очистка всего набора данных с помощью функции applymap
В определенных ситуациях вы увидите, что «грязь» не локализована в одном столбце, а более разбросана. В некоторых случаях было бы полезно применить настраиваемую функцию к каждой ячейке или элементу DataFrame. Метод Pandas .applymap() похож на метод in-построил функцию map() и просто применяет функцию ко всем элементам в DataFrame. Давайте посмотрим на пример. Мы создадим DataFrame из ранее добавленного в проект файла «university_towns.txt»:
Мы видим, что у нас есть периодические названия штатов, за которыми следуют университетские города в этом штате: StateA TownA1 TownA2 StateB TownB1 TownB2 …. Если мы посмотрим на то, как названия штатов записаны в файле, мы увидим, что все они имеют в них подстрока [edit]. Мы можем воспользоваться этим шаблоном, создав список (state, city) кортежи и обертывание этого списка в DataFrame:
Результат:
Мы можем обернуть этот список в DataFrame и установить столбцы как «State» и «RegionName». Pandas возьмет каждый элемент в списке и установит State на левое значение, а RegionName — на правое значение:
Результат:
Хотя мы могли бы очистить эти строки в цикле for выше, Pandas упрощает это. Нам нужно только название штата и название города, а все остальное можно удалить. Хотя здесь мы могли бы снова использовать методы Pandas .str(), мы также могли бы использовать applymap() для сопоставления вызываемого Python с каждым элементом DataFrame.
Переименование столбцов и пропуск строк
Часто наборы данных, с которыми вы будете работать, будут иметь либо имена столбцов, которые непросто понять, либо неважную информацию в первых нескольких и/или последних строках, такую как определения терминов в наборе данных или сноски. В этом случае, мы хотели бы переименовать столбцы и пропустить определенные строки, чтобы можно было перейти к необходимой информации с помощью правильных и понятных меток. Чтобы продемонстрировать, как это сделать, давайте сначала взглянем на первые пять строк все также ранее добавленного набора данных olympics.csv:
Теперь мы прочитаем его в DataFrame Pandas:
Результат:
Это действительно грязно! Поэтому, мы должны пропустить одну строку и установить заголовок как первую (с нулевым индексом) строку и переименовать столбцы. Для того, чтобы удалить 0-ю строку мы используем:
Результат:
Теперь у нас есть правильная строка, установленная в качестве заголовка, и все ненужные строки удалены. Обратите внимание на то, как Pandas изменил имя столбца, содержащего названия стран, с NaN на Unnamed: 0. Чтобы переименовать столбцы, мы будем использовать метод rename() DataFrame, который позволяет вам изменить метку оси на основе сопоставления (в данном случае dict). Начнем с определения словаря, который сопоставляет текущие имена столбцов (как ключи) с более удобными (значениями словаря):
Далее вызываем функцию rename() для нашего объекта:
Установка inplace в True указывает, что наши изменения будут внесены непосредственно в объект. Результат:
Для начала подготовим Excel файл с примером, который будем использовать в качестве источника данных (всю обработку данных будем делать в Python, без сохранения в Excel, для ускорения работы). Файл должен содержать лист "Данные" с такой информацией:
Сохраните файл с названием "Excel_Python-3.xlsx". Теперь запускаем Spyder, создаем новый скрипт и туда вносим следующий код, который позволит нам прочитать данные из вышеуказанного Excel файла в DataFrame, который мы будем использовать сегодня в примерах. Скрипт сохраняем в ту же папку, куда сохранили Excel файл.
import xlwings as xw
import pandas as pd
wb=xw.Book('Excel_Python-3.xlsx')
data_excel = wb.sheets['Данные']
data_pd = data_excel.range('A1:D7').options(pd.DataFrame, header = 1, index = False).value
print (data_pd)
Итак, данные прочитаны, внесены в DataFrame data_pd, с которым мы будем работать в дальнейшем.
Таблица
data_pd.shape - функция показывается количество строк и количество столбцов в таблице. В нашем случае получим (6, 4), т.е. в нашей таблице 6 строк (заголовок не считается) и 4 столбца.
data_pd.info() - получаем общую сводку о таблицу, в т.ч. какие столбцы, их названия, тип данных в столбцах, количество не пустых элементов. При выполнении функции на обучающем примере мы получим:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 4 columns):
Фамилия 6 non-null object
Имя 6 non-null object
Возраст 6 non-null float64
Доход 6 non-null float64
dtypes: float64(2), object(2)
memory usage: 320.0+ bytes
Работа со строками
data_pd = data_pd.append(, ignore_index=True) - Функция Append добавляет строку в таблицу. В качестве первого аргумента в фигурных скобках мы указываем те данные, что хотим добавить в формате 'Название столбца' : 'Значение', вторым аргументом мы говорим о том, что нам не важно в какое место таблицы добавится строка (по умолчанию в конец таблицы).
data_pd.drop([0, 1], axis=0, inplace=True) - Функция Drop удаляет строки. Первым параметром в квадратных скобках мы указываем номера строк, которые хотим удалить (нумерация строк начинается в Pandas с 0), вторым аргументом указываем что хотим удалить строку (axis=0) или столбец (axis=1), последним аргументом говорим о том, что измения должны быть произведены непосредственно в той таблице, с которой мы работаем (inplace=True), в противном случае (inplace=False) Pandas создаст копию таблицы, где удалит указанные строки, что может привести к путаницу и ошибкам.
data_pd.head(3) - Выводит указанное количество строк с начала таблицы, в данном случае 3.
data_pd[:3] - Функция аналогичная head, получаем указанное количество строк с начала таблицы.
data_pd[-3:] - Получаем указанное количество строк с конца таблицы.
Работа со столбцами
data_pd.columns - Выводит названия столбцов в таблице. В нашем случае при выполнении функции получим следующее: Index(['Фамилия', 'Имя', 'Возраст', 'Доход'], dtype='object')
data_pd.dtypes - Выводит тип данных в столбцах. В нашем случае:
Фамилия object
Имя object
Возраст float64
Доход float64
dtype: object
data_pd['Пол'] =['Муж.','Муж.','Муж.','Муж.','Муж.','Муж.'] - Добавляем новый столбец. В левой части в квадратных скобках указываем название столбца, в правой части - что в этом столбце должно содержаться. Обратите внимание, что количество записей должно равняться количеству строк в таблице, иначе получите ошибку "Length of values does not match length of index".
data_pd.drop(['Фамилия'], axis=1, inplace=True) - Функция Drop, как и говорилось ранее, удаляет столбец или строку. В данном случае в качестве первого параметра в квадратных скобках указываем название столбца, далее указываем что удаляем именно столбец (axis=1), и не забываем указать что измения должны быть произведены непосредственно в той таблице, с которой мы работаем (inplace=True).
data_pd[['Фамилия', 'Имя']] - Получаем данные только по отдельным столбцам, а не по всей таблице в целом.
Работа со строками и столбцами
data_pd.loc[[0, 1], ['Фамилия', 'Имя']] - Функция loc позволяет получить данные только по конкретным строкам и столбцам. Первым агрументом указываем номера строк, которых хотим получить, вторым - названия столбцов.
data_pd.iloc[[0, 1], [0, 1]] - Функция iloc позволяет получить данные обращаясь и к строкам и к столбцам по номерам. Показанный пример вернет теже данные, что и вариант выше (обратите внимание, что номерация столбцов, как и строк, в Pandas начинается с 0).
Отбор данных по условию
data_pd[(data_pd['Доход'] >= 30000) & (data_pd['Фамилия'] == 'Петров')] - Отбираем данные по двум условиям. В первом говорим о том, что доход должен быть больше 30 000, а фамилия сотрудника должна быть Петров. Обратите внимание, что используется логическое условие И (&) - это значит, что данные будут получены, если выполнены оба условия. При использовании логического условия ИЛИ (|), будут отобраны те строки, в которых выполняется хоть одно из указанных условий.
Как удалить строку по условию?
Здравствуйте! Что не так в этом запросе? DELETE FROM `база данных` WHERE `ФИО` = `Яценко` .
Удалить строку по условию сравнения чисел
Доброго дня Подскажите пожалуйста, как кодом удалить строки, в которых есть числа меньше 2.
Python sqlite - как удалить строку по условию
База mydatabase таблица typs столбец typs(он один) conn = sqlite3.connect('mydatabase.db').
Макрос excel 2010. Оставить строку по определенному условию, лишнее удалить
Здравствуйте, в сети много рабочих макросов для удаление строки в таблице по условию, или по.
P.s. Pandas не пробовал. Это должно как-то просто делаться. Способы, которые я нашел в учебниках и интернете в данном случае почему-то не работают.
Скорее всего как обычно - запятую в нужном месте не поставил ого, ещё немножко дорисовать и бесконечность получится))
извините, что не по теме, в питоне это что такое, где применяется?
pandas или numpy, или это одно и тоже? - ещё не добрался до них, спс
Ципихович Эндрю, увидел твой ответ сразу в тему зашёл, думаю сейчас чего нибудь опять сморозит философское ахах
это оператор побитового дополнения в python, который по существу равен -x - 1
Добавлено через 1 час 4 минуты
В учебнике Хейдт М. Изучаем Pandas. Высокопроизводительная обработка и анализ данных в Python / ИЦ "Гивиста", 2018, 487с.
Прочитал:
Присвоение результатов модификации объекта Series самой себе не всегда желательно и по возможности рекомендуется этого избегать. Результаты лучше записывать в новую серию. При необходимости можно изменять значения и добавлять/удалять строки на месте. Можно добавить дополнительную строку в серию прямо на месте, присвоив значение еще несуществующей метке индекса.
Пример работает, а для моей серии с датами, что-то пока не получается так сделать
Вот теперь наверное правильное решение!
Во втором столбце матрицы 4х4 найти минимальный элемент, удалить столбец и строку по условию
Во втором столбце матрицы 4х4 найти мин элемент и удалить столбец и строку на пересечении которых.
Удалить конкретные Series из TChart
Добрый день, форумчане! Прошу помочь в следующем вопросе: мне нужно, чтобы при достижении.
Как правильно удалить Series из Chart
Здравствуйте! Подскажите, пожалуйста, как правильно удалить программно созданные Series из Chart'a.
Двунаправленный линейный список строк. Вставить строку, удалить строку и заменить строку
3 двунаправленный линейный список строк.требуется вставить строку после строки с номером и удалить.
HP M600 Series и HP P4000 Series. Совместимость модулей двухсторонней печати
Доброго времени суток! Приобрел принтер HP M601n, да проглядел, что он без дуплекса.
Две линейки модулей DDR3 памяти - HyperX Beast Series и HyperX Black Series
Калифорнийская сompany Kingston Technology, крупнейший независимый разработчик, производитель и.
Затем я хочу отбросить строки с определенными порядковыми номерами, указанными в списке, предположим, что здесь [1,2,4], , а затем слева:
Как или какая функция может это сделать?
Используйте DataFrame.drop и передайте ему ряд индексных меток:
Вы также можете передать DataFrame.drop сам ярлык (вместо серии индексных меток):
Если DataFrame огромен, и количество строк, которые нужно удалить, также велико, тогда простое падение по индексу df.drop(df.index[]) занимает слишком много времени.
В моем случае у меня есть мультииндексированный DataFrame для float с 100M rows x 3 cols , и мне нужно удалить из него строки 10k . Самый быстрый метод, который я нашел, довольно противоречиво, для take остальных строк.
В моем случае это заняло 20.5s , а простой df.drop взял 5min 27s и потреблял много памяти. Результирующий DataFrame тот же.
Шаг 1: Сначала сформируйте фрейм данных с нежелательными строками/данными.
Шаг 2: Используйте индекс этого нежелательного фрейма данных, чтобы удалить строки из исходного фрейма данных.
Шаг 2: df = df.drop(df_age_negative.index, axis = 0)
Надеюсь, что это намного проще и поможет вам.
Если я хочу удалить строку, в которой указан индекс x , я бы сделал следующее:
Если бы я хотел отбросить несколько индексов (скажем, эти индексы есть в списке unwanted_indices ), я бы сделал:
Вот немного конкретный пример, который я хотел бы показать. Скажем, у вас много повторяющихся записей в некоторых ваших строках. Если у вас есть строковые записи, вы можете легко использовать строковые методы, чтобы найти все индексы для удаления.
А теперь отбросить эти строки, используя их индексы
В комментарии к @theodros-zelleke ответ, @j-jones спросил о том, что делать, если индекс не уникален. Мне пришлось иметь дело с такой ситуацией. Я сделал это, чтобы переименовать дубликаты в индексе, прежде чем я позвонил drop() , a la:
Определение индекса из логического значения, как описано выше, например
может быть больше памяти, чем определение индекса с помощью этого метода
Этот метод полезен при работе с большими кадрами данных и ограниченным объемом памяти.
Читайте также: