Как удалить строки с nan в pandas
Перейти к содержимому

Как удалить строки с nan в pandas

  • автор:

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » Удаление ‘nan’ в pandas

#1 Март 9, 2020 15:03:36

Volodya Зарегистрирован: 2020-02-13 Сообщения: 22 Репутация: 0 Профиль Отправить e-mail

Удаление ‘nan’ в pandas

Как удалить из массива pandas значения ‘nan’?
Пробую так, не срабатывает:

dataset_xl_O =pd.read_excel('E:/Gidrolodge_.xlsx', sheet_name='O') dataset_xl_Or =pd.read_excel('E:/Gidrolodge_.xlsx', sheet_name='Or') dataset_xl_I =pd.read_excel('E:/Gidrolodge_.xlsx', sheet_name='I') dataset_xl = pd.concat([dataset_xl_O, dataset_xl_Or, dataset_xl_I]) X_ = dataset_xl[['L', 'C', 'D']].values X=pd.DataFrame(X_) X.fillna(0) 

Отредактировано Volodya (Март 9, 2020 18:54:28)

#2 Март 11, 2020 18:30:53

Vladimirv Зарегистрирован: 2013-03-22 Сообщения: 108 Репутация: 7 Профиль Отправить e-mail

Удаление ‘nan’ в pandas

От нан можно избавиться несколькими способами, удалить строку/столбец с нан или обычно заменить нан на нуль(или еще что-то).

df.fillna(0) # на 0 

Удаляют с помощью .drop(), ищут что удалять например через .isna().

#3 Март 12, 2020 13:06:41

Volodya Зарегистрирован: 2020-02-13 Сообщения: 22 Репутация: 0 Профиль Отправить e-mail

Удаление ‘nan’ в pandas

Vladimirv
Удаляют с помощью .drop(), ищут что удалять например через .isna().

Да через неё и сделал:

def Not_Nane_str(dataset): mask = dataset.isna() for i in range(0,len(dataset)): for j in range(0,len(dataset.iloc[i])): if (mask.iat[i, j]) == True: dataset.iat[i, j]=float(0) elif dataset.iat[i, j]=='-': dataset.iat[i, j]=0 else: dataset.iat[i, j]=float(str(dataset.iat[i, j]).replace(',','.').replace(' ','')) return dataset 

Как удалить строки со значениями NaN в Pandas

Часто вас может заинтересовать удаление строк, содержащих значения NaN, в кадре данных pandas. К счастью, это легко сделать с помощью функции pandas dropna() .

В этом руководстве показано несколько примеров использования этой функции в следующих pandas DataFrame:

import numpy as np import scipy.stats as stats #create DataFrame with some NaN values df = pd.DataFrame() #view DataFrame df rating points assists rebounds 0 NaN NaN 5.0 11 1 85.0 25.0 7.0 8 2 NaN 14.0 7.0 10 3 88.0 16.0 NaN 6 4 94.0 27.0 5.0 6 5 90.0 20.0 7.0 9 6 76.0 12.0 6.0 6 7 75.0 15.0 9.0 10 8 87.0 14.0 9.0 10 9 86.0 19.0 5.0 7 

Пример 1. Удаление строк с любыми значениями NaN

Мы можем использовать следующий синтаксис, чтобы удалить все строки, которые имеют любые значения NaN:

df.dropna () rating points assists rebounds 1 85.0 25.0 7.0 8 4 94.0 27.0 5.0 6 5 90.0 20.0 7.0 9 6 76.0 12.0 6.0 6 7 75.0 15.0 9.0 10 8 87.0 14.0 9.0 10 9 86.0 19.0 5.0 7 

Пример 2. Удаление строк со всеми значениями NaN

Мы можем использовать следующий синтаксис, чтобы удалить все строки, содержащие все значения NaN в каждом столбце:

df.dropna (how='all') rating points assists rebounds 0 NaN NaN 5.0 11 1 85.0 25.0 7.0 8 2 NaN 14.0 7.0 10 3 88.0 16.0 NaN 6 4 94.0 27.0 5.0 6 5 90.0 20.0 7.0 9 6 76.0 12.0 6.0 6 7 75.0 15.0 9.0 10 8 87.0 14.0 9.0 10 9 86.0 19.0 5.0 7 

В этом конкретном DataFrame не было строк со всеми значениями NaN, поэтому ни одна из строк не была удалена.

Пример 3. Удаление строк ниже определенного порога

Мы можем использовать следующий синтаксис, чтобы удалить все строки, которые не имеют определенного, по крайней мере , определенного количества значений, отличных от NaN:

df.dropna (thresh= 3 ) rating points assists rebounds 1 85.0 25.0 7.0 8 2 NaN 14.0 7.0 10 3 88.0 16.0 NaN 6 4 94.0 27.0 5.0 6 5 90.0 20.0 7.0 9 6 76.0 12.0 6.0 6 7 75.0 15.0 9.0 10 8 87.0 14.0 9.0 10 9 86.0 19.0 5.0 7 

В самой первой строке исходного DataFrame не было по крайней мере 3 значений, отличных от NaN, так что это была единственная строка, которая была удалена.

Пример 4. Удаление строки со значениями Nan в определенном столбце

Мы можем использовать следующий синтаксис, чтобы удалить все строки, которые имеют значение NaN в определенном столбце:

df.dropna (subset=['assists']) rating points assists rebounds 0 NaN NaN 5.0 11 1 85.0 25.0 7.0 8 2 NaN 14.0 7.0 10 4 94.0 27.0 5.0 6 5 90.0 20.0 7.0 9 6 76.0 12.0 6.0 6 7 75.0 15.0 9.0 10 8 87.0 14.0 9.0 10 9 86.0 19.0 5.0 7 

Пример 5: сброс индекса после удаления строк с NaN

Мы можем использовать следующий синтаксис для сброса индекса DataFrame после удаления строк со значениями NaN:

#drop all rows that have any NaN values df = df.dropna () #reset index of DataFrame df = df.reset_index(drop=True) #view DataFrame df rating points assists rebounds 0 85.0 25.0 7.0 8 1 94.0 27.0 5.0 6 2 90.0 20.0 7.0 9 3 76.0 12.0 6.0 6 4 75.0 15.0 9.0 10 5 87.0 14.0 9.0 10 6 86.0 19.0 5.0 77 

Вы можете найти полную документацию по функции dropna() здесь .

Как очистить данные при помощи 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. Очищать и обрабатывать данные в каждом отдельном проекте нужно по-разному. В этой статье мы рассмотрели несколько методов очистки из числа самых востребованных. Вы можете создать собственный набор методов или использовать любой из множества существующих. Весь код можно посмотреть по ссылке.

лучший способ удалить nan строк в pandas

Само собой я нашел способ удалить нано строк из фрейма данных pandas. Учитывая фрейм данных dat с колонкой x , которая содержит нано значений, есть ли более элегантный способ удалить каждую строку dat , которая имеет значение nan в колонке x ?

dat = dat[np.logical_not(np.isnan(dat.x))] dat = dat.reset_index(drop=True) 

Поделиться Источник 02 апреля 2016 в 08:08

7 ответов

Используйте dropna:

dat.dropna() 

Вы можете передать параметр how для удаления, если все метки являются nan или любые из них являются nan

dat.dropna(how='any') #to drop if any value in the row has a nan dat.dropna(how='all') #to drop if all values in the row are nan 

Надеюсь, это ответит на ваш вопрос! Редактирование 1: В случае, если вы хотите удалить строки, содержащие значения nan только из определенных столбцов, как предложил Дж. Доу в своем ответе ниже, вы можете использовать следующее:

dat.dropna(subset=[col_list]) # col_list is a list of column names to consider for nan values. 

Поделиться 08 апреля 2016 в 18:28

Чтобы расширить ответ Хитеша, если вы хотите удалить строки, где 'x' конкретно является nan, вы можете использовать параметр subset. Его ответ удалит строки, где другие столбцы также имеют nans

dat.dropna(subset=['x']) 

Поделиться 07 апреля 2017 в 13:12

В случае, если команды в предыдущих ответах не работают, попробуйте это: dat.dropna(subset=['x'], inplace = True)

Поделиться 07 сентября 2017 в 07:16

  1. Удаление строк/столбцов со всеми NaN
  2. Сохранение строк/столбцов с желаемым количеством значений non-NaN (имеющих действительные данные)
# Approaching rows ------------------ # Sample df df = pd.DataFrame() print(df) Names Sunday Tuesday Wednesday Friday 0 Name1 2.0 0.0 NaN 1.0 1 Name2 NaN NaN NaN NaN 2 Name3 3.0 3.0 4.0 7.0 3 Name4 3.0 NaN NaN NaN # Keep only the rows with at least 2 non-NA values. df = df.dropna(thresh=2) print(df) Names Sunday Tuesday Wednesday Friday 0 Name1 2.0 0.0 NaN 1.0 2 Name3 3.0 3.0 4.0 7.0 3 Name4 3.0 NaN NaN NaN # Keep only the rows with at least 3 non-NA values. df = df.dropna(thresh=3) print(df) Names Sunday Tuesday Wednesday Friday 0 Name1 2.0 0.0 NaN 1.0 2 Name3 3.0 3.0 4.0 7.0 
# Approaching columns: We need axis here to direct drop to columns ------------------------------------------------------------------ # If axis=0 or not called, drop is applied to only rows like the above examples # original df print(df) Names Sunday Tuesday Wednesday Friday 0 Name1 2.0 0.0 NaN 1.0 1 Name2 NaN NaN NaN NaN 2 Name3 3.0 3.0 4.0 7.0 3 Name4 3.0 NaN NaN NaN # Keep only the columns with at least 2 non-NA values. df =df.dropna(axis=1, thresh=2) print(df) Names Sunday Tuesday Friday 0 Name1 2.0 0.0 1.0 1 Name2 NaN NaN NaN 2 Name3 3.0 3.0 7.0 3 Name4 3.0 NaN NaN # Keep only the columns with at least 3 non-NA values. df =df.dropna(axis=1, thresh=3) print(df) Names Sunday 0 Name1 2.0 1 Name2 NaN 2 Name3 3.0 3 Name4 3.0 

Conclusion:

  1. Параметр thresh из документа pd.dropna() дает вам гибкость для определения диапазона значений non-Na , которые вы хотите сохранить в строке/столбце.
  2. Параметр thresh обращается к фрейму данных вышеуказанной структуры, в которой df.dropna(how='all') не находится.

Поделиться 05 февраля 2023 в 20:08

dropna() - это, вероятно, все, что вам нужно для этого, но создание пользовательского фильтра также может помочь или быть проще понять

import pandas as pd import numpy as np df = pd.DataFrame( [[4, 7, np.nan, np.nan], [5, np.nan, 11, 2], [6, 9, 12, np.nan]], index=[1, 2, 3], columns=['a', 'b', 'c', 'd']) print(f'starting matrix:\n') #create the matrix of true/false NaNs: null_matrix = df.isnull() #create the sum of number of NaNs sum_null_matrix = null_matrix.T.sum().T #create the query of the matrix query_null = sum_null_matrix') print(f'applied matrix:\n') 

и вы получите результат:

starting matrix: a b c d 1 4 7.0 NaN NaN 2 5 NaN 11.0 2.0 3 6 9.0 12.0 NaN query matrix: 1 False 2 True 3 True dtype: bool applied matrix: a b c d 2 5 NaN 11.0 2.0 3 6 9.0 12.0 NaN 

больше информации может быть доступно в ответе на проверку nan: Как проверить, является ли какое-либо значение NaN в Pandas DataFrame

редактировать: dropna() имеет переменную порога, но не имеет переменной min. Этот ответ был для тех случаев, когда кому-то нужно было создать'min NaN' или другую пользовательскую функцию.

Поделиться 19 сентября 2022 в 22:09

Чтобы удалить строки на основе значения Nan определенного столбца:

d= pd.DataFrame([[2,3],[4,None]]) #creating data frame d Output: 0 1 0 2 3.0 1 4 NaN 
d = d[np.isfinite(d[1])] #Select rows where value of 1st column is not nan d Output: 0 1 0 2 3.0 

Поделиться 21 декабря 2019 в 17:23

Если вы хотите улучшить читаемость кода. Мы можем иметь как значения Nan, так и notNan, используя строку bool

bool_series=pd.notnull(dat["x"]) dat_notnull=dat[bool_series] dat_null =dat[~bool_series] 

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

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