目录
一.pandas中的缺失值
二.加载数据中包含缺失值
三.查看缺失值
1.通过isnull()查看缺失值数量
2.通过 missingno 条形图展示缺失值
3.通过热力图查看缺失值的相关性
四.剔除缺失值
1.Series剔除缺失值
2.DataFrame剔除缺失值
五.填充缺失值
1.使用固定值填充
2.使用统计值填充
3.使用前后的有效值填充
4.通过线性插值填充
一.pandas中的缺失值
pandas使用浮点值NaN(Not a Number)表示缺失数据,使用NA(Not 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_na=False) 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())运行结果:
可以设置按不同的坐标轴剔除缺失值,比如axis=1(或 axis='columns')会剔除任何包含缺失值的整列数据。
import pandas as pd df = pd.DataFrame([[1, pd.NA, 2], [2, 3, 5], [pd.NA, 4, 6]]) print(df) print("--------------------") print(df.dropna(axis=1))运行结果:
有时只需要剔除全部是缺失值的行或列,或者绝大多数是缺失值的行或列。这些需求可以通过设置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(how="all")) # 如果所有值都是缺失值,则删除这一行 print("--------------------") print(df.dropna(thresh=2)) # 如果至少有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)运行结果: