Pandas-04-缺失值处理
1. 如何处理NaN
-
获取缺失值的标记方式(NaN或其他标记方式)
-
如果缺失值的标记方式是NaN
-
判断数据是否包含NaN:
- pd.isnull(df)
- pd.notnull(df)
-
存在缺失值NaN:
-
删除存在的缺失值:
dropna(axis='rows')
注:不会修改原数据,而是返回删除后的数据
-
替换缺失值:
fillna(value, inplace=True)
- value:要替换为的值
- inplace:True:会直接修改原数据,False:返回修改后的数据
-
-
-
如果缺失值没有使用NaN标记,比如使用 “ ? ”
- 先替换"?"为np.nan,然后继续处理
-
2. 案例:电影数据的缺失值处理
-
读取电影文件获取数据
movie = pd.read_csv("./data/IMDB-Movie-Data.csv")
2.1. 判断缺失值是否存在
pd.notnull(movie)
# df直接调用notnull也可
movie.notnull()

可以用np.all或np.any来综合判断数据中是否有缺失值
np.all(pd.notnull(movie)) # 如果全为True,则返回True,说明没有缺失值
# 或
np.all(movie.notnull()) # 如果全为True,则返回True,说明没有缺失值
np.any(pd.isnull(movie)) # 如果存在True,则返回True,说明有缺失值
# 或
np.any(movie.isnull()) # 如果存在True,则返回True,说明有缺失值
2.2. 存在缺失值NaN,并且是np.nan
-
删除
pandas删除缺失值,使用dropna的前提是缺失值的类型必须是np.nan
# 不改变原数据,所以用新变量接收 droped_movie = movie.dropna() -
替换
替换所有缺失值
for col in movie.columns: if np.any(movie[col].isnull()): # 如果存在缺失值 movie[col].fillna(movie[col].mean(), inplace=True) # 用该列的平均值填充
2.3. 缺失值不是NaN,有默认标记的
以缺失值为 "?" 为例:
wis = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data")
如果报URLError提示SSL证书错误:
# 全局取消证书验证
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
处理思路:
-
先替换"?"为np.nan
df.replace(to_replace=, value=)
- to_replace:替换前的值
- value:替换后的值
# 把其他标记的缺失值,替换成np.nan wis.replace(to_replace="?", value=np.nan) -
再进行缺失值的处理
# 删除 wis = wis.dropna()
3. 总结
-
isnull、notnull判断是否存在缺失值【知道】
-
np.all(movie.notnull()) # 如果全为True,则返回True,说明没有缺失值np.all(movie.notnull()) # 如果全为True,则返回True,说明没有缺失值 -
np.any(movie.isnull()) # 如果存在True,则返回True,说明有缺失值np.any(movie.isnull()) # 如果存在True,则返回True,说明有缺失值
-
-
dropna删除np.nan标记的缺失值【知道】
movie.dropna()
-
fillna填充缺失值【知道】
movie[col].fillna(movie[col].mean(), inplace=True) # 用该列的平均值填充
-
replace替换某些具体值【知道】
wis.replace(to_replace="?", value=np.nan)

浙公网安备 33010602011771号