如何删除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
data = { 'A': [1, pd.NA, 3], 'B': [pd.NA, 5, 6], 'EPS': [pd.NA, 8, 9] } df = pd.DataFrame(data)
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
data = { 'A': [1, pd.NA, 3], 'B': [pd.NA, 5, 6], 'EPS': [pd.NA, 8, 9] } df = pd.DataFrame(data)
df = df.dropna(subset=['EPS']) print(df)
|
核心代码
dropna
方法的参数说明
1
| DataFrame.dropna(self, axis=0, how='any', thresh=None, subset=None, inplace=False)
|
axis
:0
表示删除行,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
df = pd.DataFrame({ 'A': [np.nan, 2, 3, 4], 'B': [np.nan, np.nan, 2, 3], 'C': [np.nan]*3 + [3] })
df1 = df.dropna()
df2 = df.dropna(how='all')
df3 = df.dropna(thresh=2)
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
方法更直观;如果需要定义更复杂的筛选条件,可以使用布尔索引。