第4章 使用Pandas进行数据预处理之4.2 数据清洗

第4章 使用Pandas进行数据预处理之4.2 数据清洗

庞立智
2023-10-23 / 0 评论 / 188 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年10月31日,已超过449天没有更新,若内容或图片失效,请留言反馈。

P-101页面

代码 4-7 利用list去重

import pandas as pd
download = pd.read_csv('../data/user_download.csv', 
                       index_col=0, encoding='gbk')
# 方法一
# 定义去重函数
def del_rep(list1):
    list2 = []
    for i in list1:
        if i not in list2:
            list2.append(i)
    return list2 
# 去重
# 将下载意愿从数据框中提取出来
download = list(download['是否愿意下载'])  
print('去重前下载意愿选项总数为:', len(download)) 
download_rep = del_rep(download)  # 使用自定义的去重函数去重
print('方法一去重后下载意愿选项总数为:', len(download_rep))
print('用户选项为:', download_rep)

代码 4-8 利用set特性去重

# 方法二
print('去重前下载意愿选项总数为:', len(download)) 
download_set = set(download)  # 利用set的特性去重
print('方法二去重后下载意愿选项总数为:', len(download_set))
print('用户选项为:', download_set)

代码 4-9 使用drop_duplicates()方法对是否愿意下载特征去重

# 对下载意愿去重
download = pd.read_csv('../data/user_download.csv', 
                       encoding='gbk')
download_select = download['是否愿意下载'].drop_duplicates() 
print('drop_duplicates方法去重之后下载意愿选项总数为:', 
      len(download_select))

代码 4-10 使用drop_duplicates()方法对多个特征去重

all_info = pd.read_csv('../data/user_all_info.csv')
print('去重之前用户的形状为:', all_info.shape)
shape_det = all_info.drop_duplicates(subset = ['用户编号', 
                                               '编号']).shape
print('依照用户编号,编号去重之后用户总信息表大小为:', shape_det)

代码 4-11 求取年龄和每月支出的相似度矩阵,利用corr()函数

# 求取年龄和每月支出的相似度
corr_det = all_info[['年龄', '每月支出']].corr(method='kendall')
print('年龄和每月支出的相似度矩阵为:\n', corr_det)

代码 4-12 求出居住类型、年龄和每月支出这3个特征的pearson相似度矩阵

corr_det1 = all_info[['居住类型', '年龄', '每月支出'
                      ]].corr(method='pearson')
print('居住类型、年龄和每月支出的pearson法相似度矩阵为:\n', corr_det1)

代码 4-13 使用equals()方法去重

# 定义求取特征是否完全相同的矩阵的函数
def feature_equals(df):
    df_equals = pd.DataFrame([])
    for i in df.columns:
        for j in df.columns:
            df_equals.loc[i, j] = df.loc[:, i].equals(df.loc[:, j])
    return df_equals
# 应用上述方法
app_desire = feature_equals(all_info)
print('app_desire的特征相等矩阵的前7行7列为:\n', 
      app_desire.iloc[:7, :7])

代码 4-14 通过遍历的方式进行数据的筛选

# 遍历所有数据
len_feature = app_desire.shape[0]
dup_col = []
for m in range(len_feature):
    for n in range(m + 1, len_feature):
        if app_desire.iloc[m, n] & (app_desire.columns[n] 
                                    not in dup_col):
            dup_col.append(app_desire.columns[n])
#进行去重操作
print('需要删除的行为:', dup_col)
all_info.drop(dup_col, axis=1, inplace=True)
print('删除多余行后all_info的特征数目为:', all_info.shape[1])

代码 4-15 处理缺失值、sum函数、isnull()方法和notnull()方法的用法


print('all_info每个特征缺失的数目为:\n', all_info.isnull().sum())
print('all_info每个特征非缺失的数目为:\n', all_info.notnull().sum())

代码 4-16 使用dropna()的方法删除缺失值

print('去除缺失的行前all_info的形状为:', all_info.shape)
all_info1 = all_info.dropna(axis=0, how='any')
print('去除缺失的行后all_info的形状为:', all_info1.shape)
all_info1.to_csv('../tmp/all_info_notnull.csv', index=False)

代码 4-17 使用fillna()方法替换缺失值

# 求每月支出平均值
mean_num = all_info['每月支出'].mean()
# 缺失值替换为均值
all_info['每月支出'] = all_info['每月支出'].fillna(mean_num)
print('每月支出特征缺失的数目为:\n', 
      all_info['每月支出'].isnull().sum())

代码 4-18 使用SciPy库中的interpolate模块进行插值

# 线性插值
import numpy as np
from scipy.interpolate import interp1d
# 创建自变量x
x = np.array([1, 2, 3, 4, 5, 8, 9, 10])  
# 创建因变量y1
y1 = np.array([2, 8, 18, 32, 50, 128, 162, 200])  
# 创建因变量y2
y2 = np.array([3, 5, 7, 9, 11, 17, 19, 21])  
# 线性插值拟合x、y1
linear_ins_value1 = interp1d(x, y1, kind='linear')  
# 线性插值拟合x、y2
linear_ins_value2 = interp1d(x, y2, kind='linear')  
print('当x为6、7时,使用线性插值y1为:', linear_ins_value1([6, 7]))
print('当x为6、7时,使用线性插值y2为:', linear_ins_value2([6, 7]))

# 拉格朗日插值
from scipy.interpolate import lagrange
large_ins_value1 = lagrange(x, y1)  # 拉格朗日插值拟合x、y1
large_ins_value2 = lagrange(x, y2)  # 拉格朗日插值拟合x、y2
print('当x为6,7时,使用拉格朗日插值y1为:', large_ins_value1([6, 7]))
print('当x为6,7时,使用拉格朗日插值y2为:', large_ins_value2([6, 7]))

# 样条插值
# 样条插值拟合x、y1
y1_new = np.linspace(x.min(), x.max(), 10)
f = interp1d(x, y1, kind='cubic')  # 编辑插值函数格式
spline_ins_value1 = f(y1_new) # 通过相应的插值函数求得新的函数点
# 样条插值拟合x、y2
y2_new = np.linspace(x.min(), x.max(), 10)
f = interp1d(x, y2, kind='cubic')  # 编辑插值函数格式
spline_ins_value2 = f(y2_new) # 通过相应的插值函数求得新的函数点
print('使用样条插值y1为:', spline_ins_value1)
print('使用样条插值y2为:', spline_ins_value2)

代码 4-19 使用3σ原则来识别异常值

all_info = pd.read_csv('../tmp/all_info_notnull.csv')
# 定义3σ原则来识别异常值函数
def out_range(ser1):
    bool_ind = (ser1.mean() - 3 * ser1.std() > ser1) | \
    (ser1.mean() + 3 * ser1.var() < ser1)
    index = np.arange(ser1.shape[0])[bool_ind]
    outrange = ser1.iloc[index]
    return outrange
outlier = out_range(all_info['年龄'])
print('使用3σ原则判定异常值个数为:', outlier.shape[0])
print('异常值的最大值为:', outlier.max())
print('异常值的最小值为:', outlier.min())

代码 4-20 根据箱底线图识别用户年龄的异常值

import matplotlib.pyplot as plt
plt.figure(figsize=(10, 8), dpi=1080) 
p = plt.boxplot(list(all_info['年龄'].values))  # 画出箱线图
outlier1 = p['fliers'][0].get_ydata()  # fliers为异常值的标签
plt.savefig('../tmp/用户年龄异常数据识别.jpg')
plt.show()
print('年龄数据异常值个数为:', len(outlier1))
print('年龄数据异常值的最大值为:', max(outlier1))
print('年龄数据异常值的最小值为:', min(outlier1))
1

评论 (0)

取消