Pandas 缺失值的处理 一、pandas中的缺失值pandas使用浮点值NaNNot a Number表示缺失数据使用NANot Available表示缺失值。NaN通常表示一个无效的或未定义的数字值是浮点数的一种特殊取值用于表示那些不能表示为正常数字的情况,如 0/0、∞-∞等数学运算的结果。nan与任何值包括它自身进行比较的结果都为False。例如在 Python 中nan nan返回False。NA一般用于表示数据不可用或缺失的情况它的含义更侧重于数据在某种上下文中是缺失或不存在的不一定特指数字类型的缺失。importnumpyasnpimportpandasaspd#导入#None的数据类型 没有数据类型print(type(None))# np.nan 表示的是数值的特殊值 不是一个数 是浮点类型print(type(np.nan))# NA 表示数据的可用与不可用性print(type(pd.NA))spd.Series(data[np.NAN,None,pd.NA],index[1,2,3])print(s)print(s.isnull())class NoneType class float class pandas.api.typing.NAType 1 NaN 2 None 3 NA dtype: object 1 True 2 True 3 True dtype: bool二、加载数据中包含缺失值dfpd.read_csv(data/weather_withna.csv)#取文件的前五行print(df.tail(5))date precipitation temp_max temp_min wind weather 1456 2015-12-27 NaN NaN NaN NaN NaN 1457 2015-12-28 NaN NaN NaN NaN NaN 1458 2015-12-29 NaN NaN NaN NaN NaN 1459 2015-12-30 NaN NaN NaN NaN NaN 1460 2015-12-31 20.6 12.2 5.0 3.8 rain1、keep_default_na参数设置是否将空白值设置为缺失值。dfpd.read_csv(data/weather_withna.csv,keep_default_naFalse)print(df.tail(5))dfpd.read_csv(data/weather_withna.csv,keep_default_naTrue)print(df.tail(5))date precipitation temp_max temp_min wind weather 1456 2015-12-27 1457 2015-12-28 1458 2015-12-29 1459 2015-12-30 1460 2015-12-31 20.6 12.2 5.0 3.8 rain date precipitation temp_max temp_min wind weather 1456 2015-12-27 NaN NaN NaN NaN NaN 1457 2015-12-28 NaN NaN NaN NaN NaN 1458 2015-12-29 NaN NaN NaN NaN NaN 1459 2015-12-30 NaN NaN NaN NaN NaN 1460 2015-12-31 20.6 12.2 5.0 3.8 rain2、na_values参数将指定值设置为缺失值dfpd.read_csv(data/weather_withna.csv,na_values[2015-12-31])print(df.tail(5))date precipitation temp_max temp_min wind weather 1456 2015-12-27 NaN NaN NaN NaN NaN 1457 2015-12-28 NaN NaN NaN NaN NaN 1458 2015-12-29 NaN NaN NaN NaN NaN 1459 2015-12-30 NaN NaN NaN NaN NaN 1460 NaN 20.6 12.2 5.0 3.8 rain三、查看缺失值1、通过isnull()查看缺失值数量dfpd.read_csv(data/weather_withna.csv)#isna()返回的是一个布尔类型 0 和 1 可以求和print(df.isna().sum())date 0 precipitation 303 temp_max 303 temp_min 303 wind 303 weather 303 dtype: int642、通过missingno条形图展示缺失值importpandasaspdimportmissingnoasmsno dfpd.read_csv(data/weather_withna.csv)msno.bar(df)Axes: 3、通过热力图查看缺失值的相关性missingno绘制的热力图能够展示数据集中不同列的缺失值之间的相关性。这里的相关性体现的是当某一列出现缺失值时其他列出现缺失值的可能性。如果两个列的缺失值呈现正相关意味着当其中一列有缺失值时另一列也很可能有缺失值若为负相关则表示当一列有缺失值时另一列更倾向于没有缺失值。颜色与数值热力图中的颜色和数值反映了列之间缺失值的相关性。接近 1 表示正相关接近 -1 表示负相关接近 0 则表示缺失值之间没有明显的关联。示例说明假如 A 列和 B 列在热力图中对应区域颜色较深且数值接近 1这就表明当 A 列出现缺失值时B 列也很可能出现缺失值若数值接近 -1情况则相反。#正相关print()#负相关print()msno.heatmap(df)print(df)date precipitation temp_max temp_min wind weather 0 2012-01-01 0.0 12.8 5.0 4.7 drizzle 1 2012-01-02 10.9 10.6 2.8 4.5 rain 2 2012-01-03 0.8 11.7 7.2 2.3 rain 3 2012-01-04 20.3 12.2 5.6 4.7 rain 4 2012-01-05 1.3 8.9 2.8 6.1 rain ... ... ... ... ... ... ... 1456 2015-12-27 NaN NaN NaN NaN NaN 1457 2015-12-28 NaN NaN NaN NaN NaN 1458 2015-12-29 NaN NaN NaN NaN NaN 1459 2015-12-30 NaN NaN NaN NaN NaN 1460 2015-12-31 20.6 12.2 5.0 3.8 rain [1461 rows x 6 columns]四、剔除缺失值1、Series剔除缺失值spd.Series(data[1,None,pd.NA],index[1,2,3],)print(s)print(s.isnull())print(s.dropna())1 1 2 None 3 NA dtype: object 1 False 2 True 3 True dtype: bool 1 1 dtype: object2、DataFrame剔除缺失值无法从DataFrame中单独剔除一个值只能剔除缺失值所在的整行或整列。默认情况下dropna()会剔除任何包含缺失值的整行数据。dfpd.DataFrame(data[[1,pd.NA,2],[2,3,5],[pd.NA,3,4]],index[1,2,3],)print(df)#去除缺失值#axis 0 去除包含缺失值的整行数据print(df.dropna(axis0))#axis 1 去除包含缺失值的整列数据print(df.dropna(axis1))0 1 2 1 1 NA 2 2 2 3 5 3 NA 3 4 0 1 2 2 2 3 5 2 1 2 2 5 3 4有时只需要剔除全部是缺失值的行或列或者绝大多数是缺失值的行或列。这些需求可以通过设置how或thresh参数来满足它们可以设置剔除行或列缺失值的数量阈值。dfpd.DataFrame(data[[1,pd.NA,2],[2,3,5],[pd.NA,3,4]],index[1,2,3],)print(df)# 如果所有值都是缺失值,则删除这一行print(df.dropna(howall))# 如果其中有缺失值 则删除这一行print(df.dropna(howany))#如果其中至少有n个值不是缺失值 这个行或者列才会保留print(df.dropna(thresh2))# 如果某一列有缺失值则进行剔除。#axis 0 按列的方向 默认是行#axis 1 按行的方向 默认是列print(df.dropna())print(df.dropna(axis1))#相当于在所有行的第0列 有缺失值 就删除这一行print(df.dropna(subset[0]))print(df.dropna(subset[0,1]))0 1 2 1 1 NA 2 2 2 3 5 3 NA 3 4 0 1 2 1 1 NA 2 2 2 3 5 3 NA 3 4 0 1 2 2 2 3 5 0 1 2 1 1 NA 2 2 2 3 5 3 NA 3 4 0 1 2 2 2 3 5 2 1 2 2 5 3 4 0 1 2 1 1 NA 2 2 2 3 5 0 1 2 2 2 3 5五、填充缺失值1、使用固定值填充通过fillna()方法传入固定值或字典进行填充。1固定值填充dfpd.read_csv(data/weather_withna.csv)print(df.fillna(1).tail(5))date precipitation temp_max temp_min wind weather 1456 2015-12-27 1.0 1.0 1.0 1.0 1 1457 2015-12-28 1.0 1.0 1.0 1.0 1 1458 2015-12-29 1.0 1.0 1.0 1.0 1 1459 2015-12-30 1.0 1.0 1.0 1.0 1 1460 2015-12-31 20.6 12.2 5.0 3.8 rain2字典填充dfpd.read_csv(data/weather_withna.csv)print(df.fillna({temp_max:60,temp_min:-60}).tail(5))date precipitation temp_max temp_min wind weather 1456 2015-12-27 NaN 60.0 -60.0 NaN NaN 1457 2015-12-28 NaN 60.0 -60.0 NaN NaN 1458 2015-12-29 NaN 60.0 -60.0 NaN NaN 1459 2015-12-30 NaN 60.0 -60.0 NaN NaN 1460 2015-12-31 20.6 12.2 5.0 3.8 rain2、使用统计值填充通过fillna()方法传入统计后的值进行填充。dfpd.read_csv(data/weather_withna.csv)print(df.fillna(df[[temp_max,temp_min,precipitation,wind]].mean()).tail(5))#或者# print(df.fillna(df[[temp_max,temp_min,precipitation,wind]].mean(),inplaceTrue))# df.tail(5)date precipitation temp_max temp_min wind weather 1456 2015-12-27 3.052332 15.851468 7.877202 3.242055 NaN 1457 2015-12-28 3.052332 15.851468 7.877202 3.242055 NaN 1458 2015-12-29 3.052332 15.851468 7.877202 3.242055 NaN 1459 2015-12-30 3.052332 15.851468 7.877202 3.242055 NaN 1460 2015-12-31 20.600000 12.200000 5.000000 3.800000 rain3、使用前后的有效值填充通过ffill()或bfill()方法使用前面或后面的有效值填充。dfpd.read_csv(data/weather_withna.csv)print(df.ffill().tail())print(df.bfill().tail())date precipitation temp_max temp_min wind weather 1456 2015-12-27 0.0 11.1 4.4 4.8 sun 1457 2015-12-28 0.0 11.1 4.4 4.8 sun 1458 2015-12-29 0.0 11.1 4.4 4.8 sun 1459 2015-12-30 0.0 11.1 4.4 4.8 sun 1460 2015-12-31 20.6 12.2 5.0 3.8 rain date precipitation temp_max temp_min wind weather 1456 2015-12-27 20.6 12.2 5.0 3.8 rain 1457 2015-12-28 20.6 12.2 5.0 3.8 rain 1458 2015-12-29 20.6 12.2 5.0 3.8 rain 1459 2015-12-30 20.6 12.2 5.0 3.8 rain 1460 2015-12-31 20.6 12.2 5.0 3.8 rain4、通过线性插值填充通过interpolate()方法进行线性插值填充。线性插值操作就是用于在已知数据点之间估算未知数据点的值。interpolate 方法支持多种插值方法可通过 method 参数指定常见的方法有’linear’线性插值基于两点之间的直线来估算缺失值适用于数据呈线性变化的情况。’time’适用于时间序列数据会考虑时间间隔进行插值。’polynomial’多项式插值通过拟合多项式曲线来估算缺失值可通过 order 参数指定多项式的阶数。importpandasaspdimportnumpyasnp#创建包含缺失值的Seriesspd.Series([1,np.nan,2,3,4,np.nan,6])print(s)s_interpolateds.interpolate()print(s_interpolated)0 1.0 1 NaN 2 2.0 3 3.0 4 4.0 5 NaN 6 6.0 dtype: float64 0 1.0 1 1.5 2 2.0 3 3.0 4 4.0 5 5.0 6 6.0 dtype: float64