数据清洗是做数据分析的第一步,总结了数据清洗常见的插值方法
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
from sklearn.tree import DecisionTreeRegressor
from sklearn.neural_network import MLPRegressor
# 创建一个包含20行20列的示例数据表,初始值为随机数
np.random.seed(42)
data = pd.DataFrame(np.random.rand(20, 20))
# 随机将100个数据设为缺失值
missing_indices = np.random.choice(range(20*20), size=100, replace=False)
for idx in missing_indices:
row_idx = idx // 20
col_idx = idx % 20
data.iloc[row_idx, col_idx] = np.nan
# 打印数据表的前几行以查看结果
print("原始数据表:")
print(data.head())
# 1. 使用均值填充缺失值
data_mean_filled = data.fillna(data.mean())
# 2. 使用中位数填充缺失值
data_median_filled = data.fillna(data.median())
# 4. 使用前一个非缺失值填充缺失值(前向填充)
data_ffill_filled = data.fillna(method='ffill')
# 5. 使用后一个非缺失值填充缺失值(后向填充)
data_bfill_filled = data.fillna(method='bfill')
# 6. 使用固定值填充缺失值
fixed_value = 0
data_fixed_filled = data.fillna(fixed_value)
# 7. 使用插值方法填充缺失值(线性插值)
data_linear_interpolation = data.interpolate()
# 8. 使用随机数填充缺失值
data_random_filled = data.apply(lambda col: col.fillna(np.random.rand()))
# 9. 使用众数(出现频率最高的值)填充缺失值
data_mode_filled = data.fillna(data.mode().iloc[0])
# 10. 使用列均值填充对应列的缺失值
data_column_mean_filled = data.copy()
for col in data.columns:
data_column_mean_filled[col].fillna(data[col].mean(), inplace=True)
# 11. 使用行均值填充对应行的缺失值
data_row_mean_filled = data.copy()
for row in data.index:
data_row_mean_filled.loc[row].fillna(data.loc[row].mean(), inplace=True)
# 12. 使用前向后向填充的平均值
data_mean_fill = data.fillna(method='ffill').fillna(method='bfill')
# 13. 使用随机行填充
random_row = data.apply(lambda row: row.dropna().sample(len(row), replace=True).values, axis=1)
data_random_row_filled = data.apply(lambda col: col.fillna(np.random.choice(random_row)))
# 14. 使用列最大值填充对应列的缺失值
data_column_max_filled = data.copy()
for col in data.columns:
data_column_max_filled[col].fillna(data[col].max(), inplace=True)
# 17. 使用行最大值填充对应行的缺失值
data_row_max_filled = data.copy()
for row in data.index:
data_row_max_filled.loc[row].fillna(data.loc[row].max(), inplace=True)
# 18. 使用前一个非缺失值填充,但限制填充范围
data_ffill_limited_filled = data.copy()
for col in data.columns:
data_ffill_limited_filled[col].fillna(method='ffill', limit=3, inplace=True)
# 19. 使用后一个非缺失值填充,但限制填充范围
data_bfill_limited_filled = data.copy()
for col in data.columns:
data_bfill_limited_filled[col].fillna(method='bfill', limit=2, inplace=True)
# 20. 使用特定列的均值填充对应列的缺失值
specific_columns = ['列1', '列2', '列3'] # 替换为实际列名
data_specific_columns_mean_filled = data.copy()
for col in specific_columns:
# 21. 使用指定列的中位数填充对应列的缺失值
specific_columns_median = ['列1', '列2', '列3'] # 替换为实际列名
data_specific_columns_median_filled = data.copy()
for col in specific_columns_median:
data_specific_columns_median_filled[col].fillna(data[col].median(), inplace=True)
# 22. 使用指定行的均值填充对应行的缺失值
specific_rows = [0, 5, 10] # 替换为实际行索引
data_specific_rows_mean_filled = data.copy()
for row in specific_rows:
data_specific_rows_mean_filled.loc[row].fillna(data.loc[row].mean(), inplace=True)
# 23. 使用前一个非缺失值填充,但限制填充范围(针对特定列)
specific_column_ffill_limited_filled = data.copy()
for col in specific_columns:
specific_column_ffill_limited_filled[col].fillna(method='ffill', limit=3, inplace=True)
# 24. 使用后一个非缺失值填充,但限制填充范围(针对特定行)
specific_row_bfill_limited_filled = data.copy()
for row in specific_rows:
specific_row_bfill_limited_filled.loc[row].fillna(method='bfill', limit=2, inplace=True)
# 25. 使用列众数填充对应列的缺失值
data_column_mode_filled = data.copy()
for col in data.columns:
mode_val = data[col].mode().iloc[0]
data_column_mode_filled[col].fillna(mode_val, inplace=True)
# 26. 使用行众数填充对应行的缺失值
data_row_mode_filled = data.copy()
for row in data.index:
mode_val = data.loc[row].mode().iloc[0]
data_row_mode_filled.loc[row].fillna(mode_val, inplace=True)
# 27. 使用前一个非缺失值填充,但限制填充范围(针对所有列)
all_columns_ffill_limited_filled = data.copy()
for col in data.columns:
all_columns_ffill_limited_filled[col].fillna(method='ffill', limit=3, inplace=True)
# 28. 使用后一个非缺失值填充,但限制填充范围(针对所有行)
all_rows_bfill_limited_filled = data.copy()
for row in data.index:
all_rows_bfill_limited_filled.loc[row].fillna(method='bfill', limit=2, inplace=True)
# 29. 使用指定列的众数填充对应列的缺失值
specific_columns_mode = ['列1', '列2', '列3'] # 替换为实际列名
data_specific_columns_mode_filled = data.copy()
for col in specific_columns_mode:
mode_val = data[col].mode().iloc[0]
data_specific_columns_mode_filled[col].fillna(mode_val, inplace=True)
# 30. 使用指定行的众数填充对应行的缺失值
specific_rows_mode = [0, 5, 10] # 替换为实际行索引
data_specific_rows_mode_filled = data.copy()
for row in specific_rows_mode:
mode_val = data.loc[row].mode().iloc[0]
data_specific_rows_mode_filled.loc[row].fillna(mode_val, inplace=True)
# 31. 使用线性回归模型
linear_reg = LinearRegression()
linear_reg.fit(features.dropna(), target.dropna())
predicted_linear_reg = linear_reg.predict(features)
# 32. 使用随机森林回归模型
rf_reg = RandomForestRegressor()
rf_reg.fit(features.dropna(), target.dropna())
predicted_rf_reg = rf_reg.predict(features)
# 33. 使用K最近邻回归模型
knn_reg = KNeighborsRegressor()
knn_reg.fit(features.dropna(), target.dropna())
predicted_knn_reg = knn_reg.predict(features)
# 34. 使用支持向量回归模型
svr_reg = SVR()
svr_reg.fit(features.dropna(), target.dropna())
predicted_svr_reg = svr_reg.predict(features)
# 35. 使用决策树回归模型
dt_reg = DecisionTreeRegressor()
dt_reg.fit(features.dropna(), target.dropna())
predicted_dt_reg = dt_reg.predict(features)
# 36. 使用多层感知器回归模型
mlp_reg = MLPRegressor()
mlp_reg.fit(features.dropna(), target.dropna())
predicted_mlp_reg = mlp_reg.predict(features)