关于数据清洗和数据处理实践学习笔记

发布于:2025-04-15 ⋅ 阅读:(16) ⋅ 点赞:(0)

一些可能想要知道的:

  • pandas是一个模板,它读取的数据都是dataframe的格式,即df

  • Matplotlib是一个用于数据可视化的Python库,能够生成各种静态、动态和交互式图表

  • pyplot:Matplotlib 的核心接口模块,提供类似 MATLAB 的绘图命令风格。

  • index_col=0 #将第一列作为文件索引

  • round() # 返回一个数值,可以指定保留几位小数  

  • df.head() #用于查看前几行的数据

  • df.shape #查看数据形状

  • df.colmns #查看列名

  • .T #表示转置

  • expand=False 时, expand 会根据正则表达式模式返回一个 Series 、 Index 或 DataFrame 当 expand=True 时,它总是返回一个 DataFrame,

  • abs() #取绝对值

  • concat()#所有的整体要括起来

  • 将列变为数组:

  1. col = df.columns.values
  2. df.columns=df.columns.str.strip()
  • encoding #文件的编码方式

如果出现CSV文件不可读,或者乱码的情况,可以改变默认来解决

#读取数据集
df = pd.read_csv('exam_scores.csv',encoding='utf-8')
#保存清洗后的数据集
df.to_csv('cleaned_exam_scores.csv',index=False,encoding='utf-8-sig')
  • import  A as B #导入模板A,且B是A的别称

import pandas as pd
  • 数据的读写

  1. pd.read_csv('文件路径')
  2. pd.read_excel('文件路径')
  • 数据的探索与描述

  • df.info() #快速了解数据结构

  • df.describe() #快速查看数据描述统计(只会显示数值型数据的描述统计)

  • 数据的简单处理(主要为列名)

  1. 去除数据间的空格

    ''.join(x.slpit())#可以吧前后中间三者的空格都去掉


    repalce(',',") #也可以用这个来将空格处理掉

  2. 英文字母大小写转换
  • 重复值的处理

  1. df.duplicated() #检测重复值,显示布尔值,支持从前往后,从后往前,默认为从前向后,默认排序第一位为原始值,向后为重复值

    df[df.duplicated()] #可查看重复值的位置


    df.duplicated().sum() #查看重复值个数

  2. df.drop_duplicates() #删除重复值,为新生成的

    df.drop_duplicates(inplace=True) #在原数据集上进行删除操作


    df.index #查看索引:开始,结束,步长

    #只要改变了原数据集,就需要重置索引 

    1.reindex

    2.df.index = range(df.shape[0]) #返回更改后的序列范围

  • 缺失值的处理

df.isnull() #查看缺失值

df.notnull() #查看非缺失值

df.dropna() #删除缺失值

df.fillna() #填补缺失值


df.xxx.isnull() #查看特定的数据的缺失值

  1. 删除缺失值
  2. 均值填补法
  3. 向前填充/向后填充

    向前填充:将后面的数据向前填充至缺失值

    向后填充:将前面的数据向后填充至缺失值

  4. 模型填补法
  • 异常值的处理

**可以通过标准差(std)来判断异常值

  1. 删除异常值的记录
  2. 作为缺失值处理
  3. 平均值修正,盖帽法修正
  4. 不处理
  • 文本字符串的处理

  1. 去除前后空格处理

    col[0].strip() #一次只能处理一个数据


    #若想去除所有

    1.写循环

    2.列表推导式

    [x.strip() for x in col] #去除前后空格

  2. 处理中间有“,”“()”之类的数据  -----repalce(',',")
  3. 正则表达式提取所需数据

**str() #进行提取,赋值

**.str.extract()

**引号里面是规则,括号里面是要提取的内容

  • 时间格式序列的处理

  1. 将系统时间格式化
  2. 系统时间和时间戳相互转换
  3. 年月日的提取

典1:学生考试成绩数据清洗

import pandas as pd
#读取数据集
df = pd.read_csv('exam_scores.csv',encoding='utf-8')

#处理缺失值
df.fillna(0,inplace=True)#将缺失值补充为0
#处理重复值
df.drop_duplicates(subset=['姓名'],inplace=True)#删除重复值
#处理异常值
score_columns = ['数学成绩','英语成绩','物理成绩']
for column in score_columns:
    mean = df[column].mean()
    std = df[column].std()
    lower_bound = mean - 3 * std
    upper_bound = mean + 3 * std
    df[column] = df[column].apply(lambda x:x if lower_bound <= x <= upper_bound else mean)
#处理冗余值
df = df.drop(columns=['学生ID'])#删除冗余学生ID
#数据格式和类型的校验和转换
df[['数学成绩','英语成绩','物理成绩']] = df[['数学成绩','英语成绩','物理成绩']].astype(float)
#保存清洗后的数据集
df.to_csv('cleaned_exam_scores.csv',index=False,encoding='utf-8-sig')
  1. inplace = True #在原数据集上进行操作
  2. lower_bound和upper_bound函数,这两个函数用于在有序数组中查找第一个大于等于或大于特定值的元素位置
  3. dataframe.apply(function,axis)对一行或一列做出一些操作(axis=1遍历行,axis=0遍历列)
  4. df[column] = df[column].apply(lambda x:x if lower_bound <= x <= upper_bound else mean)遍历Series的元素(单个数据)

典2:销售数据分析和安全处理

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


#读取销售数据
data = pd.read_csv("sales_data.csv")

#数据清洗
#缺失值处理
data = data.dropna()
#异常值处理
data = data[(data['sales'] > 0 ) & (data['sales'] < 10000 )]
#重复值处理
data = data.drop_duplicates()
# 数据格式和类型的校验与转换
data['date'] = pd.to_datetime(data['date'])

#数据分析
#描述性数据统计和数据探索
total_sales = data['sales'].sum()
avg_sales = data['sales'].mean()
max_sales = data['sales'].max()
min_sales = data['sales'].min()
#时间序列分析,进行以月分组,汇总
monthly_sales = data.groupby(data['date'].dt.to_period('M'))['sales'].sum()
#关联规则挖掘
product_associations = data.groupby('product')['sales'].sum().sort_values(ascending=False)

#数据安全处理
#数据隐私保护
data['customer_id'] = data['customer_id'].apply(hash)
#敏感信息脱敏
data['customer_name'] = data['customer_name'].apply(lambda x:x[:2] +'*' *(len(x)-2))
#数据匿名化和去标识化
data = data.drop(columns=['customer_id','customer_name'])
#数据泄露保护
#设置访问控制和权限控制,加密数据传输等

print(type(monthly_sales.index))
print(type(monthly_sales.values))

monthly_sales.index = monthly_sales.index.strftime('%Y-%m')
print(type(monthly_sales.index))
print(type(monthly_sales.values))

#输出分析结果
print("总销售额",total_sales)
print("平均销售额",avg_sales)
print("最高销售额",max_sales)
print("最低销售额",min_sales)

plt.plot(monthly_sales.index,monthly_sales.values)
plt.xlabel('Mouth')
plt.ylabel('Sales')
plt.show()

print("产品关联性排名")
print(product_associations.head())
  1. pd.to_datetime 是 pandas 库中的一个函数,用于将各种格式的日期和时间数据转换为 pandas 的 datetime 对象。
  2. .dt.to_period('M')是用于将日期列转换为按月划分的 Period 类型
  3. .sort_values(ascending=False)#将计算后的销售额按降序排序。

  4. .apply(hash)#原始 customer_id列的值被永久替换为哈希值。若后续需要原始值,需提前备份。
  5. data['customer_name'] = data['customer_name'].apply(lambda x:x[:2] +'*' *(len(x)-2)) #将顾客姓名这一敏感信息变为前两个字母加上剩余个数的*
  6. plt.plot 函数#Matplotlib 的绘图函数,用于创建折线图

  7. PeriodIndex不能直接绘图,需要转换为字符串或其他可以直接绘图的格式
  8. 如果你想要将 PeriodIndex 转换为字符串格式,可以直接使用 strftime 方法


网站公告

今日签到

点亮在社区的每一天
去签到