Как удалить строки со значениями NaN в Pandas
Часто вас может заинтересовать удаление строк, содержащих значения NaN, в кадре данных pandas. К счастью, это легко сделать с помощью функции pandas dropna() .
В этом руководстве показано несколько примеров использования этой функции в следующих pandas DataFrame:
Пример 1. Удаление строк с любыми значениями NaN
Мы можем использовать следующий синтаксис, чтобы удалить все строки, которые имеют любые значения NaN:
Пример 2. Удаление строк со всеми значениями NaN
Мы можем использовать следующий синтаксис, чтобы удалить все строки, содержащие все значения NaN в каждом столбце:
В этом конкретном DataFrame не было строк со всеми значениями NaN, поэтому ни одна из строк не была удалена.
Пример 3. Удаление строк ниже определенного порога
Мы можем использовать следующий синтаксис, чтобы удалить все строки, которые не имеют определенного, по крайней мере , определенного количества значений, отличных от NaN:
В самой первой строке исходного DataFrame не было по крайней мере 3 значений, отличных от NaN, так что это была единственная строка, которая была удалена.
Пример 4. Удаление строки со значениями Nan в определенном столбце
Мы можем использовать следующий синтаксис, чтобы удалить все строки, которые имеют значение NaN в определенном столбце:
Пример 5: сброс индекса после удаления строк с NaN
Мы можем использовать следующий синтаксис для сброса индекса DataFrame после удаления строк со значениями NaN:
pandas.DataFrame.dropna#
See the User Guide for more on which values are considered missing, and how to work with missing data.
Parameters axis <0 or ‘index’, 1 or ‘columns’>, default 0
Determine if rows or columns which contain missing values are removed.
0, or ‘index’ : Drop rows which contain missing values.
1, or ‘columns’ : Drop columns which contain missing value.
Changed in version 1.0.0: Pass tuple or list to drop on multiple axes. Only a single axis is allowed.
Determine if row or column is removed from DataFrame, when we have at least one NA or all NA.
Pandas Data Cleaning: Remove rows with empty data or missing values
A trivia task that for data cleaning or machine learning model preparation is to remove rows or columns that have empty data or missing values.
Example of removing rows.
Here are two quick ways to do it.
- Use dropna() that when you don’t care which rows, just drop them.
2. Use drop() with a list of row numbers. Sometimes you do care which rows. Keep a copy of row numbers that has NaN. So we define a custom empty_rows() helper function first.
If readability is really not what you concern, I also make a one liner function for you as below: (Remeber ‘Readability counts’ from Zen? I would say it is ok for a quick helper function as long as you documented properly)
(if the dataset is hugh, runing in iterrows() loops may cause performance issue. You should consider subset to chunk then proceed and merge end results)
Then we use drop() to take list of row number to remove. We keep a copy of the list, in case we want to audit it later or manually alter it. For example, some rows are still valuable even they were missing some data. (Always case by case, depends on your business logic)
A more ‘pandas’ way is to to subset based on that condition, then get index list of that subset. .e.g
This approach utilizes numpy vectorization feature. It actually performs much faster than above manual iteration. Recommended.
And another one-liner to subset any row(s) contain missing / empty value:
Drop rows that with particular colums contain missing value:
It will remove rows whose ‘costPrice’ and/or ‘SuggessedPrice’ missing.
Dropping is quick, always bear in mind how to drop, whether to drop, should I drop.
Unnecessry dropping may impact your ultimate model test data and outcome.
Удаление строк, содержащих пустые ячейки, из DataFrame панд
У меня есть pd.DataFrame, который был создан путем анализа некоторых таблиц Excel. Столбец которого содержит пустые ячейки. Например, ниже представлен вывод частоты этого столбца, 32320 записей имеют отсутствующие значения для Арендатора.
Я пытаюсь удалить строки, где отсутствует Tenant, однако опция isnull не распознает отсутствующие значения.
В столбце есть тип данных “Объект”. Что происходит в этом случае? Как я могу удалить записи, где отсутствует арендатор?
Pandas распознает значение как нулевое, если это объект np.nan , который будет печататься как NaN в DataFrame. Ваши пропущенные значения, вероятно, пустые строки, которые Pandas не распознает как нулевые. Чтобы это исправить, вы можете преобразовать пустые строки (или все, что находится в ваших пустых ячейках) в объекты np.nan используя replace() , а затем вызвать dropna() в вашем DataFrame, чтобы удалить строки с нулевыми арендаторами.
Чтобы продемонстрировать, мы создаем DataFrame с некоторыми случайными значениями и пустыми строками в столбце Tenants :
Теперь мы заменим все пустые строки в Tenants колонке с np.nan объектов, например, так:
Теперь мы можем отбросить нулевые значения:
value_counts опускает NaN по умолчанию, поэтому вы, скорее всего, имеете дело с “”.
Итак, вы можете просто отфильтровать их, например
Там, где в ячейке есть пробел, вы не можете его увидеть, используйте
заменить пробел на NaN, затем
Pythonic + Pandorable: df[df[‘col’].astype(bool)]
Пустые строки ложные, что означает, что вы можете фильтровать значения типа bool следующим образом:
Если ваша цель – удалить не только пустые строки, но и строки, содержащие только пробелы, заранее используйте str.strip :
Быстрее, чем ты думаешь
.astype – это векторизованная операция, это быстрее, чем все представленные варианты. По крайней мере, из моих тестов. YMMV.
Вот сравнение времени, я добавил некоторые другие методы, которые я мог придумать.
Код для сравнения, для справки:
Вы можете использовать этот вариант:
Это приведет к выходу (** – выделение только требуемых строк):
Итак, чтобы отбросить все, что не имеет значения “образование”, используйте следующий код: