Как удалить строки Pandas DataFrame, значение которых в определенном столбце равно NaN
Это старый вопрос, который забили до смерти, но я верю, что в этой ветке можно найти более полезную информацию. Читайте дальше, если вы ищете ответ на любой из следующих вопросов:
- Могу ли я отбросить строки, если какое-либо из его значений имеет NaN? А если все они NaN?
- Могу ли я смотреть на NaN только в определенных столбцах при отбрасывании строк?
- Могу ли я удалить строки с определенным количеством значений NaN?
- Как удалить столбцы вместо строк?
- Я пробовал все варианты выше, но мой DataFrame просто не обновляется!
Уже было сказано, что df.dropna
- это канонический метод удаления NaN из DataFrames, но нет ничего лучше нескольких визуальных подсказок, которые могут помочь на этом пути.
# Setup
df = pd.DataFrame({
'A': [np.nan, 2, 3, 4],
'B': [np.nan, np.nan, 2, 3],
'C': [np.nan]*3 + [3]})
df
A B C
0 NaN NaN NaN
1 2.0 NaN NaN
2 3.0 2.0 NaN
3 4.0 3.0 3.0
Ниже приводится подробное описание наиболее важных аргументов и того, как они работают, в формате часто задаваемых вопросов.
Могу ли я отбросить строки, если какое-либо из его значений имеет NaN? А если все они NaN?
Здесь пригодится аргумент how=...
. Это может быть один из
'any'
(по умолчанию) - отбрасывает строки, если хотя бы один столбец имеет NaN
'all'
- отбрасывает строки, только если все его столбцы имеют NaN
<!_ ->
# Removes all but the last row since there are no NaNs
df.dropna()
A B C
3 4.0 3.0 3.0
# Removes the first row only
df.dropna(how='all')
A B C
1 2.0 NaN NaN
2 3.0 2.0 NaN
3 4.0 3.0 3.0
Примечание
Если вы просто хотите увидеть, какие строки являются пустыми (IOW, если вам нужна логическая маска строк), используйте _ 8_:
df.isna()
A B C
0 True True True
1 False True True
2 False False True
3 False False False
df.isna().any(axis=1)
0 True
1 True
2 True
3 False
dtype: bool
Чтобы получить инверсию этого результата, используйте _ 10_.
Могу ли я смотреть на NaN только в определенных столбцах при отбрасывании строк?
Это вариант использования аргумента subset=[...]
.
Укажите список столбцов (или индексов с axis=1
), чтобы сообщить pandas, что вы хотите просматривать только эти столбцы (или строки с axis=1
) при удалении строк (или столбцов с axis=1
.
# Drop all rows with NaNs in A
df.dropna(subset=['A'])
A B C
1 2.0 NaN NaN
2 3.0 2.0 NaN
3 4.0 3.0 3.0
# Drop all rows with NaNs in A OR B
df.dropna(subset=['A', 'B'])
A B C
2 3.0 2.0 NaN
3 4.0 3.0 3.0
Могу ли я удалить строки с определенным количеством значений NaN?
Это вариант использования аргумента thresh=...
. Задайте минимальное количество значений NON-NULL как целое число.
df.dropna(thresh=1)
A B C
1 2.0 NaN NaN
2 3.0 2.0 NaN
3 4.0 3.0 3.0
df.dropna(thresh=2)
A B C
2 3.0 2.0 NaN
3 4.0 3.0 3.0
df.dropna(thresh=3)
A B C
3 4.0 3.0 3.0
Здесь следует отметить, что вам нужно указать, сколько значений NON-NULL вы хотите сохранить, а не сколько значений NULL вы хотите отбросить. Это проблема для новых пользователей.
К счастью, исправить это просто: если у вас есть счетчик значений NULL, просто вычтите его из размера столбца, чтобы получить правильный аргумент порога для функции.
required_min_null_values_to_drop = 2 # drop rows with at least 2 NaN
df.dropna(thresh=df.shape[1] - required_min_null_values_to_drop + 1)
A B C
2 3.0 2.0 NaN
3 4.0 3.0 3.0
Как удалить столбцы вместо строк?
Используйте аргумент axis=...
, это может быть axis=0
или axis=1
.
Сообщает функции, хотите ли вы удалить строки (axis=0
) или столбцы (axis=1
).
df.dropna()
A B C
3 4.0 3.0 3.0
# All columns have rows, so the result is empty.
df.dropna(axis=1)
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3]
# Here's a different example requiring the column to have all NaN rows
# to be dropped. In this case no columns satisfy the condition.
df.dropna(axis=1, how='all')
A B C
0 NaN NaN NaN
1 2.0 NaN NaN
2 3.0 2.0 NaN
3 4.0 3.0 3.0
# Here's a different example requiring a column to have at least 2 NON-NULL
# values. Column C has less than 2 NON-NULL values, so it should be dropped.
df.dropna(axis=1, thresh=2)
A B
0 NaN NaN
1 2.0 NaN
2 3.0 2.0
3 4.0 3.0
Я пробовал все варианты выше, но мой DataFrame просто не обновляется!
dropna
, как и большинство других функций в pandas API, в качестве результата возвращает новый DataFrame (копию оригинала с изменениями), поэтому вы должны вернуть его, если хотите увидеть изменения.
df.dropna(...) # wrong
df.dropna(..., inplace=True) # right, but not recommended
df = df.dropna(...) # right
Ссылка
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html.
DataFrame.dropna(
self, axis=0, how='any', thresh=None, subset=None, inplace=False)
![введите описание изображения здесь](https://i.stack.imgur.com/77fqu.png)
person
cs95
schedule
18.06.2020