Как удалить строки со значениями 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() здесь .
лучший способ удалить 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
- Удаление строк/столбцов со всеми NaN
- Сохранение строк/столбцов с желаемым количеством значений 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:
- Параметр thresh из документа pd.dropna() дает вам гибкость для определения диапазона значений non-Na , которые вы хотите сохранить в строке/столбце.
- Параметр 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]
Изучаем pandas. Урок 4. Работа с пропусками в данных
Очень часто большие объемы данных, которые подготавливаются для последующего анализа, имеют пропуски. Для того, чтобы можно было использовать алгоритмы машинного обучения, строящие модели по этим данным, в большинстве случаев, необходимо эти пропуски чем-то и как-то заполнить. На вопрос “чем заполнять?” мы не будем отвечать в рамках данного урока, а вот на вопрос “как заполнять?” ответим.
- pandas и отсутствующие данные
- Замена отсутствующих данных
- Удаление объектов/столбцов с отсутствующими данными
pandas и отсутствующие данные
Для начала, хочется сказать, что в документации по библиотеке pandas есть целый раздел, посвященный данной тематике.
Для наших экспериментов создадим структуру DataFrame , которая будет содержать пропуски. Для этого импортируем необходимые нам библиотеки.
In [1]: import pandas as pd In [2]: from io import StringIO
После этого создадим объект в формате csv . CSV – это один из наиболее простых и распространенных форматов хранения данных, в котором элементы отделяются друг от друга запятыми, более подробно о нем можете прочитать здесь.
In [3]: data = 'price,count,percent\n1,10,\n2,20,51\n3,30,' In [4]: df = pd.read_csv(StringIO(data))
Полученный объект df – это DataFrame с пропусками.
In [5]: df Out[5]: price count percent 0 1 10 NaN 1 2 20 51.0 2 3 30 NaN
В нашем примере, у объектов с индексами 0 и 2 отсутствуют данные в поле percent . Отсутствующие данные помечаются как NaN . Добавим к существующей структуре еще один объект (запись), у которого будет отсутствовать значение в поле count.
In [6]: df.loc[3] = 'price':4, 'count':None, 'percent':26.3> In [7]: df Out[7]: price count percent 0 1.0 10.0 NaN 1 2.0 20.0 51.0 2 3.0 30.0 NaN 3 4.0 NaN 26.3
Для начала обратимся к методам из библиотеки pandas , которые позволяют быстро определить наличие элементов NaN в структурах. Если таблица небольшая, то можно использовать библиотечный метод isnull . Выглядит это так.
In [8]: pd.isnull(df) Out[8]: price count percent 0 False False True 1 False False False 2 False False True 3 False True False
Таким образом мы получаем таблицу того же размера, но на месте реальных данных в ней находятся логические переменные, которые принимают значение False , если значение поля у объекта есть, или True , если значение в данном поле – это NaN . В дополнение к этому можно посмотреть подробную информацию об объекте, для этого можно воспользоваться методом info() .
In [9]: df.info() class 'pandas.core.frame.DataFrame'> Int64Index: 4 entries, 0 to 3 Data columns (total 3 columns): price 4 non-null float64 count 3 non-null float64 percent 2 non-null float64 dtypes: float64(3) memory usage: 128.0 bytes
В нашем примере видно, что объект df имеет три столбца ( count , percent и price ), при этом в столбце price все объекты значимы – не NaN , в столбце count – один NaN объект, в поле percent – два NaN объекта. Можно воспользоваться следующим подходом для получения количества NaN элементов в записях.
In [10]: df.isnull().sum() Out[10]: price 0 count 1 percent 2 dtype: int64
Замена отсутствующих данных
Отсутствующие данные объектов можно заменить на конкретные числовые значения, для этого можно использовать метод fillna() . Для экспериментов будем использовать структуру df , созданную в предыдущем разделе.
In [11]: df.isnull().sum() Out[11]: price 0 count 1 percent 2 dtype: int64 In [12]: df Out[12]: price count percent 0 1.0 10.0 NaN 1 2.0 20.0 51.0 2 3.0 30.0 NaN 3 4.0 NaN 26.3 In [13]: df.fillna(0) Out[13]: price count percent 0 1.0 10.0 0.0 1 2.0 20.0 51.0 2 3.0 30.0 0.0 3 4.0 0.0 26.3
Этот метод не изменяет текущую структуру, он возвращает структуру DataFrame , созданную на базе существующей, с заменой NaN значений на те, что переданы в метод в качестве аргумента. Данные можно заполнить средним значением по столбцу.
In [14]: df.fillna(df.mean()) Out[14]: price count percent 0 1.0 10.0 38.65 1 2.0 20.0 51.00 2 3.0 30.0 38.65 3 4.0 20.0 26.30
В зависимости от задачи используется тот или иной метод заполнения отсутствующих элементов, это может быть нулевое значение, математическое ожидание, медиана и т.п. Для замены NaN элементов на конкретные значения, можно использовать интерполяцию, которая реализована в методе interpolate(), алгоритм интерполяции задается через аргументы метода.
Удаление объектов/столбцов с отсутствующими данными
Довольно часто используемый подход при работе с отсутствующими данными – это удаление записей (строк) или полей (столбцов), в которых встречаются пропуски. Для того, чтобы удалить все объекты, которые содержат значения NaN воспользуйтесь методом dropna() без аргументов.
In [15]: df.dropna() Out[15]: price count percent 1 2.0 20.0 51.0
Вместо записей, можно удалить поля, для этого нужно вызвать метод dropna с аргументом axis=1 .
In [16]: df.dropna() Out[16]: price count percent 1 2.0 20.0 51.0 In [17]: df.dropna(axis=1) Out[17]: price 0 1.0 1 2.0 2 3.0 3 4.0
pandas позволяет задать порог на количество не- NaN элементов. В приведенном ниже примере будут удалены все столбцы, в которых количество не- NaN элементов меньше трех.
In [18]: df.dropna(axis = 1, thresh=3) Out[18]: price count 0 1.0 10.0 1 2.0 20.0 2 3.0 30.0 3 4.0 NaN
P.S.
Раздел: Pandas Python Машинное обучение и анализ данных Метки: Pandas, Python, Машинное обучение
Изучаем pandas. Урок 4. Работа с пропусками в данных : 4 комментария
- Карл 11.04.2018 Полезная статья, решила одну из моих проблем с кодом) Интересно будет узнать, ЧЕМ заполнять пропуски?
- writer 14.04.2018 В начале написал комментарий, частично повторив содержимое статьи))) Чем заполнять, определяется задачей, т.е. если можно заполнить средним значением, то заполняйте средним, если данные чувствительны к таким махинациям, то можно просто их выбросить.
Pandas.dropna() – удаление NaN строк в Python
Если ваш набор данных состоит из нулевых значений, мы можем использовать метод Pandas.dropna() для анализа и удаления строк или столбцов в наборе данных.
Синтаксис
DataFrameName.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
Параметры
- axis : , значение по умолчанию 0. Он принимает целочисленные или строковые значения для строк/столбцов. Входными данными могут быть 0 и 1 для целых чисел и индекс или столбцы для строки.
- 0 или «index»: удалить строки, содержащие пропущенные значения.
- 1 или «columns»: удалите столбцы, содержащие отсутствующее значение.
- any: удаляет строку/столбец, если какое-либо значение равно null.
- all: отбрасывается, только если все значения равны нулю.
Returns
Он возвращает DataFrame, из которого были удалены записи NA.
Пример
Для демонстрации сначала мы берем CSV-файл, который удаляет любой столбец из набора данных.
import pandas as pd aa = pd.read_csv("aa.csv") aa.head()
Name Hire Date Salary Leaves Remaining 0 John Idle 03/15/14 50000.0 10 1 Smith Gilliam 06/01/15 65000.0 8 2 Parker Chapman 05/12/14 45000.0 10 3 Jones Palin 11/01/13 70000.0 3 4 Terry Gilliam 08/12/14 48000.0 7 5 Michael Palin 05/23/13 66000.0 8 # importing pandas module import pandas as pd # making data frame from csv file info = pd.read_csv("aa.csv") # making a copy of old data frame copy = pd.read_csv("aa.csv") # creating value with all null values in new data frame copy["Null Column"]= None # checking if column is inserted properly print(info.columns.values, "\n", copy.columns.values) # comparing values before dropping null column print("\nColumn number before dropping Null column\n", len(info.dtypes), len(copy.dtypes)) # dropping column with all null values copy.dropna(axis = 1, how ='all', inplace = True) # comparing values after dropping null column print("\nColumn number after dropping Null column\n", len(info.dtypes), len(info.dtypes))
[' Name Hire Date Salary Leaves Remaining'] [' Name Hire Date Salary Leaves Remaining' 'Null Column'] Column number before dropping Null column 1 2 Column number after dropping Null column 1 1
Вышеприведенный код удалил пустой столбец из набора данных и вернул новый DataFrame.