Python数据分析和数据处理库Pandas(缺失值处理函数)
目录一.pandas中的缺失值二.加载数据中包含缺失值三.查看缺失值1.通过isnull()查看缺失值数量2.通过 missingno 条形图展示缺失值3.通过热力图查看缺失值的相关性四.剔除缺失值1.Series剔除缺失值2.DataFrame剔除缺失值五.填充缺失值1.使用固定值填充2.使用统计值填充3.使用前后的有效值填充4.通过线性插值填充一.pandas中的缺失值pandas使用浮点值NaNNot a Number表示缺失数据使用NANot Available表示缺失值。可以通过isnull()、isna()或notnull()、notna()方法判断某个值是否为缺失值。Nan通常表示一个无效的或未定义的数字值是浮点数的一种特殊取值用于表示那些不能表示为正常数字的情况如0/0、∞-∞等数学运算的结果。nan与任何值包括它自身进行比较的结果都为False。例如在 Python 中nan nan返回False。NA一般用于表示数据不可用或缺失的情况它的含义更侧重于数据在某种上下文中是缺失或不存在的不一定特指数字类型的缺失。na和nan都用于表示缺失值但nan更强调是数值计算中的特殊值而na更强调数据的可用性或存在性。import pandas as pd import numpy as np s pd.Series([np.nan, None, pd.NA]) print(s) print(-----------------) print(s.isnull())运行结果二.加载数据中包含缺失值import pandas as pd df pd.read_csv(data/weather_withna.csv) print(df.tail(5))运行结果可以通过keep_default_na参数设置是否将空白值设置为缺失值。import pandas as pd df pd.read_csv(data/weather_withna.csv, keep_default_naFalse) print(df.tail(5))运行结果可通过na_values参数将指定值设置为缺失值。import pandas as pd df pd.read_csv(data/weather_withna.csv, na_values[2015-12-31]) print(df.tail(5))运行结果三.查看缺失值1.通过isnull()查看缺失值数量import pandas as pd df pd.read_csv(data/weather_withna.csv) print(df.isnull().sum())运行结果2.通过 missingno 条形图展示缺失值先安装missingno包pip install missingnoimport pandas as pd import missingno as msno import matplotlib.pyplot as plt df pd.read_csv(data/weather_withna.csv) msno.bar(df) plt.show()运行结果3.通过热力图查看缺失值的相关性missingno绘制的热力图能够展示数据集中不同列的缺失值之间的相关性。这里的相关性体现的是当某一列出现缺失值时其他列出现缺失值的可能性。如果两个列的缺失值呈现正相关意味着当其中一列有缺失值时另一列也很可能有缺失值若为负相关则表示当一列有缺失值时另一列更倾向于没有缺失值。颜色与数值热力图中的颜色和数值反映了列之间缺失值的相关性。接近 1 表示正相关接近 -1 表示负相关接近 0 则表示缺失值之间没有明显的关联。示例说明假如 A 列和 B 列在热力图中对应区域颜色较深且数值接近 1这就表明当 A 列出现缺失值时B 列也很可能出现缺失值若数值接近 -1情况则相反。import pandas as pd import missingno as msno import matplotlib.pyplot as plt df pd.read_csv(data/weather_withna.csv) # msno.bar(df) msno.heatmap(df) plt.show()运行结果四.剔除缺失值通过dropna()方法来剔除缺失值。1.Series剔除缺失值import pandas as pd import numpy as np s pd.Series([1, pd.NA, None]) print(s) print(-----------------) print(s.dropna())运行结果2.DataFrame剔除缺失值无法从DataFrame中单独剔除一个值只能剔除缺失值所在的整行或整列。默认情况下dropna()会剔除任何包含缺失值的整行数据。import pandas as pd df pd.DataFrame([[1, pd.NA, 2], [2, 3, 5], [pd.NA, 4, 6]]) print(df) print(--------------------) print(df.dropna())运行结果可以设置按不同的坐标轴剔除缺失值比如axis1或 axiscolumns会剔除任何包含缺失值的整列数据。import pandas as pd df pd.DataFrame([[1, pd.NA, 2], [2, 3, 5], [pd.NA, 4, 6]]) print(df) print(--------------------) print(df.dropna(axis1))运行结果有时只需要剔除全部是缺失值的行或列或者绝大多数是缺失值的行或列。这些需求可以通过设置how或thresh参数来满足它们可以设置剔除行或列缺失值的数量阈值。import pandas as pd df pd.DataFrame([[1, pd.NA, 2], [pd.NA, pd.NA, 5], [pd.NA, pd.NA, pd.NA]]) print(df) print(--------------------) print(df.dropna(howall)) # 如果所有值都是缺失值,则删除这一行 print(--------------------) print(df.dropna(thresh2)) # 如果至少有2个值不是缺失值,则保留这一行运行结果可以通过设置subset参数来设置某一列有缺失值则进行剔除。import pandas as pd import numpy as np df pd.DataFrame([[1, pd.NA, 2], [pd.NA, pd.NA, 5], [pd.NA, pd.NA, pd.NA]]) print(df) print(--------------------) print(df.dropna(subset[0])) # 如果0列有缺失值,则删除这一行运行结果五.填充缺失值1.使用固定值填充import pandas as pd df pd.read_csv(data/weather_withna.csv) print(df.fillna(0).tail()) # 使用固定值填充运行结果import pandas as pd df pd.read_csv(data/weather_withna.csv) print(df.fillna({temp_max: 60, temp_min: -60}).tail()) # 使用字典来填充运行结果2.使用统计值填充通过fillna()方法传入统计后的值进行填充。import pandas as pd import numpy as np df pd.read_csv(data/weather_withna.csv) # 使用平均值填充 print(df.fillna(df[[precipitation, temp_max, temp_min, wind]].mean()).tail())运行结果3.使用前后的有效值填充通过ffill()或bfill()方法使用前面或后面的有效值填充。import pandas as pd df pd.read_csv(data/weather_withna.csv) print(df.ffill().tail()) # 使用前面的有效值填充 print(-------------------) print(df.bfill().tail()) # 使用后面的有效值填充运行结果4.通过线性插值填充通过interpolate()方法进行线性插值填充。线性插值操作就是用于在已知数据点之间估算未知数据点的值。interpolate 方法支持多种插值方法可通过 method 参数指定常见的方法有linear线性插值基于两点之间的直线来估算缺失值适用于数据呈线性变化的情况。time适用于时间序列数据会考虑时间间隔进行插值。polynomial多项式插值通过拟合多项式曲线来估算缺失值可通过 order 参数指定多项式的阶数。暂时了解即可import pandas as pd import numpy as np # 创建包含缺失值的 Series s pd.Series([1, np.nan, 3, 4, np.nan, 6]) # 使用默认的线性插值方法填充缺失值 s_interpolated s.interpolate() print(s_interpolated)运行结果