- 缺失值处理
1. 识别缺失值
在处理缺失值之前,首先需要识别数据中的缺失值。
1.1 使用
isna()
和isnull()
Pandas 提供了
isna()
和isnull()
方法来检测缺失值,二者功能相同。import pandas as pd df = pd.DataFrame({ 'A': [1, 2, None, 4], 'B': [None, 2, 3, 4], 'C': [1, None, None, 4] }) # 检测缺失值 print(df.isna())
1.2 汇总缺失值
使用
sum()
可以汇总缺失值的数量。# 每列缺失值的数量 print(df.isna().sum()) # 每行缺失值的数量 print(df.isna().sum(axis=1))
2. 删除缺失值
有时删除缺失值是最佳选择,特别是当缺失值较多或数据无用时。
2.1 删除包含缺失值的行
使用
dropna()
删除包含缺失值的行。df_cleaned = df.dropna() print(df_cleaned)
2.2 删除包含缺失值的列
通过设置
axis=1
,可以删除包含缺失值的列。df_cleaned = df.dropna(axis=1) print(df_cleaned)
2.3 根据特定条件删除缺失值
使用
thresh
参数可以保留至少有指定数量非缺失值的行或列。df_cleaned = df.dropna(thresh=2) print(df_cleaned)
3. 填充缺失值
填充缺失值是一种常用的策略,特别是在不能删除数据的情况下。
3.1 使用固定值填充
使用
fillna()
方法可以用指定的值填充缺失值。df_filled = df.fillna(0) print(df_filled)
3.2 使用前向或后向填充
使用
method
参数选择前向填充(ffill
)或后向填充(bfill
)。# 前向填充 df_filled = df.fillna(method='ffill') print(df_filled) # 后向填充 df_filled = df.fillna(method='bfill') print(df_filled)
3.3 使用均值、中位数或众数填充
可以根据列的统计值进行填充,如均值、中位数或众数。
# 用列的平均值填充 df_filled = df.fillna(df.mean()) print(df_filled) # 用列的中位数填充 df_filled = df.fillna(df.median()) print(df_filled) # 用列的众数填充 df_filled = df.fillna(df.mode().iloc[0]) print(df_filled)
4. 替换特定值
有些数据集中缺失值可能被标记为特定的值,如
-999
。可以将这些值替换为 NaN。df_replaced = df.replace(-999, pd.NA)
5. 插值法填充缺失值
插值法通过已有数据来估算未知数据点。
5.1 线性插值
Pandas 提供
interpolate()
方法进行插值填充。df_interpolated = df.interpolate(method='linear') print(df_interpolated)
5.2 时间序列插值
如果数据是时间序列,可以使用
time
方法进行插值。df_time_interpolated = df.interpolate(method='time') print(df_time_interpolated)
6. 拉格朗日插值法填充缺失值
拉格朗日插值法基于所有数据点构建多项式,从而估算缺失值。
6.1 拉格朗日插值法的基本概念
拉格朗日插值多项式 L(x)L(x)L(x) 通过构造基函数 li(x)l_i(x)li(x) 并将其线性组合来估算缺失值。
6.2 拉格朗日插值法的 Python 实现
import pandas as pd from scipy.interpolate import lagrange import numpy as np # 读取Excel文件 df = pd.read_excel('data.xlsx') # 假设你的数据在以下列中 x_column = 'X' # X轴的列名 y_column = 'Y' # Y轴的列名 # 提取非缺失值的部分进行插值 x = df[x_column].dropna().values y = df[y_column].dropna().values # 创建拉格朗日插值多项式 poly = lagrange(x, y) # 查找缺失值所在的行并填充 missing_rows = df[df[y_column].isna()].index for i in missing_rows: x_missing = df.at[i, x_column] y_missing = poly(x_missing) df.at[i, y_column] = y_missing # 打印填充后的DataFrame print(df) # 保存填充后的数据到Excel文件 df.to_excel('filled_data.xlsx', index=False)
7. 牛顿插值法填充缺失值
牛顿插值法使用差商表构建插值多项式,适合逐步添加数据点的情况。
7.1 牛顿插值法的基本概念
牛顿插值通过构造差商表并逐步构建多项式进行插值。
7.2 牛顿插值法的 Python 实现
import pandas as pd import numpy as np # 读取Excel文件 df = pd.read_excel('data.xlsx') # 假设你的数据在以下列中 x_column = 'X' # X轴的列名 y_column = 'Y' # Y轴的列名 # 提取非缺失值部分进行插值 x = df[x_column].dropna().values y = df[y_column].dropna().values # 计算差商表 def divided_diff(x, y): n = len(y) coef = np.zeros([n, n]) coef[:, 0] = y for j in range(1, n): for i in range(n - j): coef[i][j] = (coef[i + 1][j - 1] - coef[i][j - 1]) / (x[i + j] - x[i]) return coef[0, :] # 返回差商表的第一行 # 计算牛顿插值多项式 def newton_poly(coef, x_data, x): n = len(coef) - 1 p = coef[n] for k in range(1, n + 1): p = coef[n - k] + (x - x_data[n - k]) * p return p # 计算差商表的系数 coef = divided_diff(x, y) # 查找缺失值所在的行并填充 missing_rows = df[df[y_column].isna()].index for i in missing_rows: x_missing = df.at[i, x_column] y_missing = newton_poly(coef, x, x_missing) df.at[i, y_column] = y_missing # 打印填充后的DataFrame print(df) # 保存填充后的数据到Excel文件 df.to_excel('filled_data_newton.xlsx', index=False)
8. 检查和处理重复值
处理缺失值后,检查并处理数据中的重复值同样重要。
8.1 检查重复值
使用
duplicated()
方法检查重复行。print(df.duplicated())
8.2 删除重复值
使用
drop_duplicates()
方法删除重复行。df_no_duplicates = df.drop_duplicates() print(df_no_duplicates)
9. 高级操作:条件填充和分组处理
9.1 根据条件填充缺失值
有时需要根据其他列的条件填充缺失值。
df['C'] = df['C'].fillna(df['A'] + df['B'])
9.2 分组填充
可以对数据进行分组,然后对每个组分别填充缺失值。
df['C'] = df.groupby('A')['C'].transform(lambda x: x.fillna(x.mean()))