pandas中df.dropna()删除缺失值的参数详解与实战
本文详解pandas中df.dropna()函数的使用,涵盖Series和DataFrame的缺失值删除。重点解析axis、how、thresh、subset和inplace等关键参数,通过具体代码示例展示如何灵活处理不同场景下的NaN数据,帮助开发者高效清理数据。
核心参数解析
在pandas中,dropna()是处理缺失值(NaN)的核心方法。其完整签名如下:
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)理解各参数对结果的影响是正确使用该函数的关键:
- axis:指定删除维度。0表示按行删除(默认),1表示按列删除。
- how:指定删除条件。
'any'表示只要存在NaN即删除(默认);'all'表示仅当所有值均为NaN时才删除。 - thresh:设定非NaN值的最小数量。若某行(或列)非NaN值少于该整数,则被删除。
- subset:指定参与判断的列标签列表。仅检查这些列中的缺失值,其他列即使有NaN也不影响删除决策。
- inplace:布尔值。为
True时直接修改原数据,不返回新对象;为False时返回删除后的新DataFrame。
Series对象处理
对于一维Series对象,dropna()可直接滤除缺失数据。此外,也可利用布尔索引配合notnull()实现相同效果。
import pandas as pd
import numpy as np
from numpy import nan as NaN
# 创建包含NaN的Series
se1 = pd.Series([4, NaN, 8, NaN, 5])
print(se1)
# 方法一:直接使用dropna
se1.dropna()
# 方法二:使用布尔序列过滤
se1[se1.notnull()]上述两种方法均会返回仅包含非NaN值的Series,索引保持原始顺序。
DataFrame对象处理
处理二维DataFrame时,需根据业务需求选择删除策略。默认情况下,dropna()会删除任何包含NaN值的行。
基础删除示例
假设有一个包含不同缺失情况的DataFrame:
df = pd.DataFrame({
"name": ['Alfred', 'Batman', 'Catwoman'],
"toy": [np.nan, 'Batmobile', 'Bullwhip'],
"born": [pd.NaT, pd.Timestamp("1940-04-25"), pd.NaT]
})
print(df)执行df.dropna()后,由于第0行和第2行的born列为NaT(Not a Time,时间序列中的NaN),第0行的toy列为NaN,只有第1行完全无缺失值,因此结果仅保留第1行。
按列删除(axis=1)
若需删除包含缺失值的列,可设置axis=1:
df.dropna(axis=1)此时,只要某列中存在NaN,该列就会被移除。上例中toy列和born列均含缺失值,故仅保留name列。
精确控制删除条件
通过组合how和thresh参数,可实现更精细的控制:
- how='all':仅删除全为NaN的行。上例中第0行和第2行并非全为NaN,故均被保留。
- thresh=n:保留至少有n个非NaN值的行。例如
thresh=2时,第2行有2个非NaN值(name和toy),被保留;第0行仅1个非NaN值,被删除。
# 仅删除全为NaN的行
df.dropna(how='all')
# 保留至少有2个非NaN值的行
df.dropna(thresh=2)指定列检查(subset)
当只需关注特定列的缺失情况,而忽略其他列的缺失时,使用subset参数:
# 仅检查'name'和'born'列的缺失值
df.dropna(subset=['name', 'born'])上例中,第0行在born列有NaT,第2行在born列也有NaT,因此这两行均被删除,即使第0行的toy列有值。
原地修改(inplace)
若希望直接修改原始DataFrame以节省内存,可设置inplace=True:
df.dropna(inplace=True)
print(df)执行后,df对象本身被修改,不再包含缺失行。
综合应用示例
以下代码展示了处理包含多种缺失情况的DataFrame的完整流程:
import pandas as pd
import numpy as np
# 创建示例数据
df1 = pd.DataFrame([
[1, 2, 3],
[np.nan, np.nan, 2],
[np.nan, np.nan, np.nan],
[8, 8, np.nan]
])
# 1. 默认删除:移除任何含NaN的行
print(df1.dropna())
# 2. 仅删除全为NaN的行
print(df1.dropna(how='all'))
# 3. 添加一列全为NaN的数据
df1[3] = np.nan
# 4. 删除包含NaN的列(axis=1)且仅当全为NaN时
df1.dropna(axis=1, how='all')
# 5. 保留至少有1个非NaN值的行
print(df1.dropna(thresh=1))
# 6. 保留至少有3个非NaN值的行
print(df1.dropna(thresh=3))通过灵活组合这些参数,可以应对数据清洗中的各种缺失值处理需求。
以上就是pandas中df.dropna()删除缺失值的详细内容,更多关于pandas数据清洗的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









