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

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

技术背景

在数据处理过程中,经常会遇到数据缺失的情况,Pandas DataFrame中的某些列可能包含NaN(Not a Number)值。这些缺失值可能会影响后续的数据分析和建模,因此需要将包含NaN值的行删除。

实现步骤

方法一:使用布尔索引

可以直接通过布尔索引筛选出某列不为NaN的行。

1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd

# 示例DataFrame
data = {
'A': [1, pd.NA, 3],
'B': [pd.NA, 5, 6],
'EPS': [pd.NA, 8, 9]
}
df = pd.DataFrame(data)

# 筛选出EPS列不为NaN的行
df = df[df['EPS'].notna()]
print(df)

方法二:使用dropna方法

dropna方法提供了更灵活的方式来删除包含NaN值的行。

1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd

# 示例DataFrame
data = {
'A': [1, pd.NA, 3],
'B': [pd.NA, 5, 6],
'EPS': [pd.NA, 8, 9]
}
df = pd.DataFrame(data)

# 删除EPS列包含NaN值的行
df = df.dropna(subset=['EPS'])
print(df)

核心代码

dropna方法的参数说明

1
DataFrame.dropna(self, axis=0, how='any', thresh=None, subset=None, inplace=False)
  • axis0表示删除行,1表示删除列,默认为0
  • how'any'表示只要有一个NaN值就删除,'all'表示所有值都为NaN才删除,默认为'any'
  • thresh:指定非NaN值的最小数量。
  • subset:指定要考虑的列。
  • inplace:是否在原DataFrame上进行修改,默认为False

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import pandas as pd
import numpy as np

# 创建示例DataFrame
df = pd.DataFrame({
'A': [np.nan, 2, 3, 4],
'B': [np.nan, np.nan, 2, 3],
'C': [np.nan]*3 + [3]
})

# 删除所有包含NaN值的行
df1 = df.dropna()

# 仅当所有列都为NaN时才删除行
df2 = df.dropna(how='all')

# 删除至少有两个非NaN值的行
df3 = df.dropna(thresh=2)

# 删除特定列中包含NaN值的行
df4 = df.dropna(subset=['A'])

print("删除所有包含NaN值的行:")
print(df1)
print("\n仅当所有列都为NaN时才删除行:")
print(df2)
print("\n删除至少有两个非NaN值的行:")
print(df3)
print("\n删除特定列中包含NaN值的行:")
print(df4)

最佳实践

考虑数据更新

dropna方法默认返回一个新的DataFrame,如果要更新原DataFrame,可以使用inplace=True,但不推荐这种方式,建议使用赋值操作。

1
2
df = df.dropna(subset=['EPS'])  # 推荐
df.dropna(subset=['EPS'], inplace=True) # 不推荐

处理大量列的数据

在处理大量列的数据时,可以先查看有多少列包含NaN值。

1
2
3
4
5
6
7
8
print("No. of columns containing null values")
print(len(df.columns[df.isna().any()]))

print("No. of columns not containing null values")
print(len(df.columns[df.notna().all()]))

print("Total no. of columns in the dataframe")
print(len(df.columns))

自动删除行列

根据行列中NaN值的数量自动删除行列。

1
2
df = df.drop(df.columns[df.isna().sum()>len(df.columns)], axis=1)
df = df.dropna(axis=0).reset_index(drop=True)

常见问题

DataFrame不更新

dropna方法默认返回一个新的DataFrame,需要将其赋值给原变量才能更新。

1
2
df = df.dropna(...)  # 正确
df.dropna(...) # 错误

选择合适的方法

如果只是简单地删除某列包含NaN值的行,使用dropna方法更直观;如果需要定义更复杂的筛选条件,可以使用布尔索引。


如何删除Pandas DataFrame中某列值为NaN的行
https://119291.xyz/posts/how-to-drop-rows-of-pandas-dataframe-whose-value-in-a-certain-column-is-nan/
作者
ww
发布于
2025年6月25日
许可协议