Python pandas处理缺失值方法详解(dropna、drop、fillna)
本文详细介绍Python pandas中处理缺失值的三种核心方法:删除含缺失值的样本或特征列,以及使用具体数值或前后值进行填充。通过dropna、drop和fillna函数的参数详解与代码示例,帮助开发者快速掌握数据清洗技巧。
在处理数据时,面对缺失值主要有三种处理策略:
- 策略一:直接删除包含缺失值的样本(即行数据)。
- 策略二:直接删除包含缺失值的特征列(即整个字段)。
- 策略三:使用特定值对缺失值进行填充,例如0、平均值或中位数等。
dropna和fillna函数均适用于DataFrame和Series对象,本文主要聚焦于DataFrame的操作。
针对策略一(删除样本):
可以使用DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)函数来实现。
该函数的关键参数说明如下:
- axis参数用于指定操作维度(行或列)。
- axis=0:表示删除包含缺失值的行。
- axis=1:表示删除包含缺失值的列。
- how参数与axis配合使用,决定删除的严格程度。
- how='any':只要行或列中存在任意缺失值,即执行删除操作。
- how='all':仅当行或列中的所有值均为缺失值时,才执行删除操作。
- thresh:设定阈值,若指定axis方向上非缺失值的数量少于thresh,则删除该行或列。
- 例如,当axis=0且thresh=10时,表示如果某行的非缺失值数量小于10,则删除该行。
- subset:接受列表类型参数。
- 用于指定在哪些特定列中检查缺失值,其他列的缺失值将被忽略。
- inplace:布尔值,决定是否在原数据上直接修改。若为True,返回None;若为False(默认),返回去除了缺失值的新副本。
建议在使用时明确写出所有缺省参数,以便代码更具可读性和易理解性。
具体示例如下:
df = pd.DataFrame(
{"name": ['Alfred', 'Batman', 'Catwoman'],
"toy": [np.nan, 'Batmobile', 'Bullwhip'],
"born": [pd.NaT, pd.Timestamp("1940-04-25")
pd.NaT]})
>>> df
name toy born
0 Alfred NaN NaT
1 Batman Batmobile 1940-04-25
2 Catwoman Bullwhip NaT
# Drop the rows where at least one element is missing.
>>> df.dropna()
name toy born
1 Batman Batmobile 1940-04-25
# Drop the columns where at least one element is missing.
>>> df.dropna(axis='columns')
name
0 Alfred
1 Batman
2 Catwoman
# Drop the rows where all elements are missing.
>>> df.dropna(how='all')
name toy born
0 Alfred NaN NaT
1 Batman Batmobile 1940-04-25
2 Catwoman Bullwhip NaT
# Keep only the rows with at least 2 non-NA values.
>>> df.dropna(thresh=2)
name toy born
1 Batman Batmobile 1940-04-25
2 Catwoman Bullwhip NaT
# Define in which columns to look for missing values.
>>> df.dropna(subset=['name', 'born'])
name toy born
1 Batman Batmobile 1940-04-25
# Keep the DataFrame with valid entries in the same variable.
>>> df.dropna(inplace=True)
>>> df
name toy born
1 Batman Batmobile 1940-04-25针对策略二(删除特征列):
可以使用dropna或者drop函数来实现,参考代码DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')。
- labels:指定需要删除的行或列的名称列表。
- axis:0代表操作行,1代表操作列。
df = pd.DataFrame(np.arange(12).reshape(3,4),
columns=['A', 'B', 'C', 'D'])
>>>df
A B C D
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
# 删除列
>>> df.drop(['B', 'C'], axis=1)
A D
0 0 3
1 4 7
2 8 11
>>> df.drop(columns=['B', 'C'])
A D
0 0 3
1 4 7
2 8 11
# 删除行(索引)
>>> df.drop([0, 1])
A B C D
2 8 9 10 11针对策略三(填充缺失值):
可以使用DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)函数来实现。
- value:可以是标量、字典、Series或DataFrame,用于指定填充的值。
- 若value为字典,可以指定每一列使用什么具体的值进行填充。
- method:可选{'backfill', 'bfill', 'pad', 'ffill', None},默认为None。
- 上述操作均可在列维度上执行。
- ffill或pad:使用前一个有效值来填充当前的缺失值。
- backfill或bfill:使用后一个有效值来填充当前的缺失值。
- limit:限制填充的缺失值个数,此参数在实际应用中较少使用。
f = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]],
columns=list('ABCD'))
>>> df
A B C D
0 NaN 2.0 NaN 0
1 3.0 4.0 NaN 1
2 NaN NaN NaN 5
3 NaN 3.0 NaN 4
# 使用0代替所有的缺失值
>>> df.fillna(0)
A B C D
0 0.0 2.0 0.0 0
1 3.0 4.0 0.0 1
2 0.0 0.0 0.0 5
3 0.0 3.0 0.0 4
# 使用后边或前边的值填充缺失值
>>> df.fillna(method='ffill')
A B C D
0 NaN 2.0 NaN 0
1 3.0 4.0 NaN 1
2 3.0 4.0 NaN 5
3 3.0 3.0 NaN 4
>>>df.fillna(method='bfill')
A B C D
0 3.0 2.0 NaN 0
1 3.0 4.0 NaN 1
2 NaN 3.0 NaN 5
3 NaN 3.0 NaN 4
# Replace all NaN elements in column ‘A', ‘B', ‘C', and ‘D', with 0, 1, 2, and 3 respectively.
# 每一列使用不同的缺失值
>>> values = {'A': 0, 'B': 1, 'C': 2, 'D': 3}
>>> df.fillna(value=values)
A B C D
0 0.0 2.0 2.0 0
1 3.0 4.0 2.0 1
2 0.0 1.0 2.0 5
3 0.0 3.0 2.0 4
#只替换第一个缺失值
>>>df.fillna(value=values, limit=1)
A B C D
0 0.0 2.0 2.0 0
1 3.0 4.0 NaN 1
2 NaN 1.0 NaN 5
3 NaN 3.0 NaN 4以房价分析为例:
在此数据集中,仅total_bedrooms一列存在缺失值,采用上述三种方法处理的代码如下:
# option 1 将含有缺失值的行去掉
housing.dropna(subset=["total_bedrooms"])
# option 2 将"total_bedrooms"这一列从数据中去掉
housing.drop("total_bedrooms", axis=1)
# option 3 使用"total_bedrooms"的中值填充缺失值
median = housing["total_bedrooms"].median()
housing["total_bedrooms"].fillna(median) 此外,sklearn提供了专门的Imputer类来处理缺失值,具体使用教程可参考:https://www.jb51.net/article/259441.htm。
总结
本文介绍了Python pandas中处理缺失值的三种主要方法(dropna、drop、fillna)。如需了解更多pandas处理缺失值的相关内容,请搜索本站历史文章或继续浏览后续文章,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









