如何删除 Pandas DataFrame 中特定列值为 NaN 的行

如何删除 Pandas DataFrame 中特定列值为 NaN 的行

技术背景

在数据处理和分析中,我们经常会遇到数据缺失的情况,Pandas 是 Python 中用于数据处理和分析的强大库,其中的 DataFrame 是常用的数据结构。当 DataFrame 中的某些行在特定列的值为 NaN(Not a Number,即缺失值)时,为了保证数据的质量和分析结果的准确性,我们可能需要删除这些行。

实现步骤

1. 筛选非 NaN 行

使用布尔索引来筛选出特定列中值不为 NaN 的行。

2. 使用 dropna 方法

利用 Pandas 提供的 dropna 方法,通过指定 subset 参数来删除特定列中包含 NaN 的行。

核心代码

示例数据

1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np

data = {
'STK_ID': [601166, 600036, 600016, 601009, 601939, 000001],
'EPS': [np.nan, np.nan, 4.3, np.nan, 2.5, np.nan],
'cash': [np.nan, 12, np.nan, np.nan, np.nan, np.nan]
}
df = pd.DataFrame(data)

方法一:使用布尔索引

1
df = df[df['EPS'].notna()]

方法二:使用 dropna 方法

1
df.dropna(subset=['EPS'], inplace=True)

方法三:使用 query 方法

1
df = df.query('EPS.notna().values')

方法四:利用 np.nan != np.nan 的特性

1
df = df.query("EPS == EPS")

最佳实践

选择合适的方法

  • 如果只需要简单地删除特定列中包含 NaN 的行,使用 dropna(subset=['column_name']) 方法是最直接和常用的方式。
  • 如果需要根据多个条件进行筛选,布尔索引和 query 方法会更加灵活。

注意 inplace 参数

在使用 dropna 方法时,inplace=True 会直接修改原 DataFrame,而 inplace=False(默认值)会返回一个新的 DataFrame。建议在修改原 DataFrame 之前先备份数据,以免误操作导致数据丢失。

检查结果

在删除行之后,使用 isna().sum() 方法检查特定列中是否还存在 NaN 值,确保操作成功。

1
print(df['EPS'].isna().sum())

常见问题

1. SettingWithCopyWarning 警告

当使用布尔索引创建新的 DataFrame 并进行修改时,可能会收到 SettingWithCopyWarning 警告。可以通过设置 pd.set_option('mode.copy_on_write', True) 来避免这个警告。

2. 索引问题

删除行后,DataFrame 的索引可能会不连续。可以使用 reset_index(drop=True) 方法重新设置索引。

1
df = df.reset_index(drop=True)

3. 处理多列 NaN

如果需要根据多列的 NaN 情况删除行,可以在 dropna 方法的 subset 参数中指定多个列名,或者使用布尔索引结合逻辑运算符进行筛选。

1
df.dropna(subset=['EPS', 'cash'], how='any', inplace=True)

如何删除 Pandas DataFrame 中特定列值为 NaN 的行
https://119291.xyz/posts/how-to-drop-rows-with-nan-in-a-specific-column-of-pandas-dataframe/
作者
ww
发布于
2025年4月22日
许可协议