Как удалить строки с пустыми значениями pandas
Перейти к содержимому

Как удалить строки с пустыми значениями pandas

  • автор:

Как очистить данные при помощи Pandas

Очистка данных — это процесс удаления, добавления или изменения данных для их анализа или других задач машинного обучения. Если очистить данные необходимо, начинать всегда следует с именно с этого.

Клайв Хамби сказал: «Данные — это новая нефть». И, как и нефть, они нуждаются в очистке.

Зачем нужна очистка данных?

Данные можно считать одним из самых важных активов компании. Ошибки или неточности в данных могут послужить причиной краха.

Но доступные нам данные ценны не сами по себе. Чтобы сделать их полезными, над ними нужно поработать. Например — удалить ненужные, отформатировать и модифицировать важные. В некоторых случаях для обработки данных приходится что-то добавлять. Скажем, можно добавить столбец языка, основываясь на уже имеющихся данных, или сгенерировать столбец со средним значением, основываясь на данных какого-нибудь другого столбца.

Вступление

Процесс очистки данных многоступенчатый, но не всегда необходимы все этапы.

Чтобы очистить данные, мы будем использовать язык программирования Python и библиотеку Pandas.

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

Что касается Pandas, это быстрая, мощная, гибкая и простая в использовании библиотека для работы с данными. Она имеет открытый код и очень популярна.

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

Как очистить данные: пошаговое руководство

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

От редакции Pythonist. На нашем сайте есть статья по этой теме — «Чтение файлов в формате CSV в Python».

import pandas as pd # 1. Чтение данных из csv - способ по умолчанию df = pd.read_csv('my_file.csv') # 2. Чтение данных из csv с использованием запятой в качестве разделителя df = pd.read_csv('my_file.csv', delimiter=',') # 3. Чтение данных из csv с использованием запятой в качестве разделителя и без заголовков df = pd.read_csv('my_file.csv', delimiter=',', header=None) # 4. Чтение данных из csv с использованием запятой в качестве разделителя и с пользовательскими заголовками my_headers = ['Id','Name', 'Type', 'Price'] df = pd.read_csv('my_file.csv', delimiter=',', header=0, names=my_headers)

Удаление дублирующихся данных

Чтобы очистить данные, некоторые шаги нужно сделать обязательно. Один из таких шагов — удаление дубликатов. И тут не важно, идет речь о текстовых или числовых данных. Если у вас слишком много дубликатов, это увеличивает время обработки данных.

# 1. Удаление дубликатов и возврат копии датафрейма df = df.drop_duplicates() # 2. Удаление дубликатов в исходном датафрейме df = df.drop_duplicates(inplace=True) # 3. Отбрасываем дубликаты, оставляя первое/последнее вхождение df = df.drop_duplicates(inplace=True, keep='last') # 4. Для нахождения дубликатов учитываем только определенные столбцы df = df.drop_duplicates(subset=['Id', 'Price'], inplace=True, keep='last')

Удаление эмодзи

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

f = df.astype(str).apply(lambda x: x.str.encode('ascii', 'ignore').str.decode('ascii'))

Здесь мы переводим все данные в значения ASCII, а те, которые не могут быть переведены, игнорируем. После перевода в значения ASCII наш код переводит данные обратно. Так мы получаем все наши данные без эмодзи.

Перевод данных в нижний регистр

Весьма вероятно, что вам придется изменить регистр данных. Здесь мы переводим их в нижний. Больше примеров можно найти в документации.

df['Type'] = df['Type'].str.lower() df['Name'] = df['Name'].str.lower()

Удаление множественных пробелов, табов и символов перевода строки

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

df['Type'] = df['Type'].str.replace('\n', '') df['Type'] = df['Type'].str.replace('\t', ' ') df['Type'] = df['Type'].str.replace(' ', ' ', regex=True) df['Type'] = df['Type'].str.strip()

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

Удаление URL-адресов

Для получения данных многие пользуются опросами. Но люди невнимательно заполняют поля, и порой в этих данных встречаются URL-адреса. Регулярное выражение, приведенное ниже, удаляет URL. Вы можете использовать и любой другой regex-паттерн для поиска URL. Здесь найденные адреса заменяются пустой строкой.

df['Type'] = df['Type'].replace(r'http\S+', '', regex=True).replace(r'www\S+', '', regex=True)

Отбрасываем строки с пустыми данными

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

df.dropna() df['Type'].astype(bool) df = df[df['Type'].astype(bool)]

Первая строка кода удаляет все строки, содержащие np.nan , pd.NaT и None . Остальные удаляют строки, содержащие символы пустой строки. Второй метод быстрый, но если в столбце будет хотя бы пробел, он не сработает. Это еще одна причина обрезать лишние пробелы заранее.

Дальнейшая обработка данных

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

import numpy as np df = df.drop(['Id', 'Name'], axis=1) df = df[df['Type'].str.contains('frozen') | df['Type'].str.contains('green')] def detect_price(row): if row['Price'] > 15.50: return 'High' elif row['Price'] > 5.50 and row['Price'] 0.0 and row['Price'] 

Здесь в третьей строке мы отбрасываем два столбца с именами Id и Name и возвращаем копию нового датафрейма.

Четвертая строка проверяет, содержит ли столбец Type строку frozen или green , затем возвращает True и сохраняет эту строку.

Строки с 7 по 17 создают новый столбец с именем Range на основе данных столбца Price . Используя лямбда-функцию, мы передаем каждую строку в функцию detect_price и возвращаем значение на основе цены. Затем возвращаемое значение присваивается новому столбцу в строке, переданной в функцию. Мы используем np.NaN , чтобы потом иметь возможность удалить эти строки при помощи df.dropna() .

Заключение

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

Как удалить из столбца строку с пустым списком?

Можно через apply применить len и потом проверить, что длина списка не нулевая:

df = df[df['name'].apply(len) > 0] 
 name Date Address 0 [rick, mike, morty] 11/05/2011 AR 2 [brick, nick] 1/01/2014 RU 3 [rick, reaven, bart, homer] 12/20/2020 EU 4 [rick, morty] 9/30/2009 BY 

Отслеживать
ответ дан 20 фев 2022 в 17:11
70.2k 5 5 золотых знаков 20 20 серебряных знаков 51 51 бронзовый знак
можно ещё так попробовать df[df['name'].apply(bool)]
20 фев 2022 в 18:24
@Danis Уже есть такой ответ и он реально хороший )
20 фев 2022 в 18:25

Если вам нужно удалить сам список, то можно с помощью цикла for таким образом:

for i in d['name']: if len(i) == 0: del d['name'][d['name'].index(i)] 

Обратите внимание, что если пустых списков будет больше одного, то это не сработает. Уточните, если необходимо удалить произвольное количество пустых списков.

Если нужно удалить из словаря весь ключ, где находится пустой список, со всеми значениями:

flag = False for i in d: for j in d[i]: if len(j) == 0: del d[i] flag = True break if flag: break 

Удаление строк с NaN в определенном столбце в Pandas DataFrame

Часто при работе с данными в Python с помощью библиотеки Pandas возникают ситуации, когда в определенном столбце присутствуют пропущенные значения (NaN).

Алексей Кодов
Автор статьи
7 июля 2023 в 18:14

Часто при работе с данными в Python с помощью библиотеки Pandas возникают ситуации, когда в определенном столбце присутствуют пропущенные значения (NaN). Во многих случаях, для анализа данных удобнее работать только с полными данными, то есть удалять те строки, в которых есть пропущенные значения.

Пример ситуации: имеется DataFrame с информацией о компаниях и их доходах. Однако, в некоторых строках данные о доходах отсутствуют и отображаются как NaN.

import pandas as pd import numpy as np data = df = pd.DataFrame(data)

В результате получается следующий DataFrame:

| | Компания | Доход |
|—:|:———————|———:|
| 0 | ООО «Рога и Копыта» | 500000 |
| 1 | АО «Красная шапка» | NaN |
| 2 | ООО «Зайцы и морковка» | 300000 |
| 3 | АО «Белые медведи» | NaN |

Для удаления строк с пропущенными значениями в столбце ‘Доход’ можно воспользоваться методом dropna :

df = df.dropna(subset=['Доход'])

В результате получим DataFrame без строк, в которых в столбце ‘Доход’ были пропущенные значения:

| | Компания | Доход |
|—:|:———————|———:|
| 0 | ООО «Рога и Копыта» | 500000 |
| 2 | ООО «Зайцы и морковка» | 300000 |

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

Как найти строки с отсутствующими данными в Pandas Dataframe

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

Для начала давайте загрузим наш учебный пример:

import pandas as pd
url='https://drive.google.com/file/d/1KXfupiJKql5Lc-D73KiiS_jEd_CNIW44/view?usp=sharing'
url2='https://drive.google.com/uc?id=' + url.split('/')[-2]
df = pd.read_csv(url2)
df.info()

Это база данных по приложениям в Google Play и как вы видите, к примеру в столбце Rating, много пустых элементов.
Для отбора строк, где в одном указанном столбце, отсутствуют данные, мы можем воспользоваться стандартным инструментом фильтрации. К примеру, отберем те строки, по которым в столбце Current Ver нет информации:

df[df['Current Ver'].isnull()]

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

is_null = df.isnull()

Для каждой позиции мы получим результат False или True, где False – в ячейке есть данные, True – в ячейке NaN.
Как мы видели выше, в 15 строке у нас отсутствует информация о Current Ver, давайте проверим при помощи функции iloc, какие данные по 15 строке у нас в Dataframe is_null:

is_null.iloc[15,]

Все верно, по всем столбцам, кроме Current Ver, у нас False, а по столбцу Current Ver у нас True, так как в нем нет какой-либо информации.
Далее нам надо сформировать Series, которая нам послужит в дальнейшем фильтром, в которой значение True будет в случае, если хотя бы в одном столбце в строке нет данных, а False, если информация есть во всех столбцах:

row_with_null = is_null.any(axis=1)

Используя эту Series как фильтр, мы создаем новый Dataframe, в который переносим только те строки, в которых хотя бы в одном из столбцов есть NaN:

rows_with_null = df[row_with_null]

Готово, мы нашли все строки с отсутствующими данными в Dataframe. В качестве бонуса прикладываю ноутбук с текущего урока. Спасибо за внимание, комментарии приветствуются.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *