Python:14个常用数据清洗代码

本文详细介绍数据预处理的各种方法,包括数据整合、筛选、匹配、透视表、排序、替换、删除、降采样、缺失值处理、噪声处理、数据正规化、泛化、连续性指派、离散化等,为数据分析师和机器学习工程师提供实用指南。
部署运行你感兴趣的模型镜像

常用库导入

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
pd.options.display.max_columns = None #显示所有列
pd.set_option('display.float_format', lambda x: '%.2f' % x) #取消科学计数法

1、数据整合(concat)

train_data = pd.read_csv('training30.csv')
test_data = pd.read_csv('test30.csv')
total_data = pd.concat([train_data, test_data], axis=0)
total_data.info()

在这里插入图片描述

2、数据筛选

cdma = pd.read_csv('cdma.xls', encoding='gbk', sep='\t')
print(cdma.shape)
cdma = cdma[(cdma['销售区局'] == '浦东电信局') & (cdma['渠道管理细分'].isin(['专营渠道', '中小渠道', '开放渠道']))]
print(cdma.shape)
# cdma = cdma[~cdma['发展部门名称'].str.contains('千秋')]
# print(cdma.shape)

在这里插入图片描述

3、数据匹配(merge)

match_table = pd.read_excel('数据说明与匹配公式.xlsx', sheet_name='部门匹配表')
new_cdma = cdma.merge(match_table, how='left', on=['发展部门名称', '渠道管理细分'])
new_cdma = new_cdma[new_cdma['渠道管理细分'] == '专营渠道']
new_cdma[['统计日期', '订单号', '所属部门', '所属代理商', '所属分局', '渠道经理']].head()

在这里插入图片描述

4、数据透视表(pivot_table)

cdma_pivot = new_cdma.pivot_table(index='所属代理商', values='订单号', columns='所属分局', aggfunc='count', fill_value=0, margins=True, margins_name='合计')
cdma_pivot

在这里插入图片描述

5、数据排序(sort_values)

cdma_pivot.sort_values(by='合计',inplace=True, ascending=False)
cdma_pivot

在这里插入图片描述

6、数据替换(replace)

train_data = train_data.replace('?', np.nan) #精准匹配
train_data.head(10)
train_data2 = train_data.replace('Tai', 'Cy', regex=True) #模糊匹配
train_data2.head(10)

在这里插入图片描述

7、数据删除(dropna)

print(train_data.shape)
train_data3 = train_data.dropna(subset=['gender', 'age'])
print(train_data3.shape)

在这里插入图片描述

8、降采样

def lower_sample_data(df, labelname, percent=1):
    '''
    percent:多数类别下采样的数量相对于少数类别样本数量的比例
    '''
    data1 = df[df[labelname] == 1]  # 将少数类别的样本放在data1
    data0 = df[df[labelname] == 0]  # 将多数类别的样本放在data0
    index = np.random.randint(
        len(data0), size=percent * (len(data1)))  # 随机给定下采样取出样本的序号
    lower_data0 = data0.iloc[list(index)]  # 下采样
    return(pd.concat([lower_data0, data1]))

print(train_data["'Purchase or not'"].value_counts())
train_data4 = lower_sample_data(train_data, "'Purchase or not'", percent=1)
print(train_data4["'Purchase or not'"].value_counts())

在这里插入图片描述

9、缺失值处理(fillna)

train_data5 = pd.read_csv('cs-training.csv')
per_columns = set(train_data5.columns) - set(['CustomerID', 'SeriousDlqin2yrs'])

for column in per_columns:
    temp_mean = train_data5[column].mean() #如果是中位数的话是median,众数的话是mode
    train_data5[column] = train_data5[column].fillna(temp_mean)
train_data5.describe()

在这里插入图片描述

10、噪声处理

方法一:四分位法

def cap(x, quantile=[0.05, 0.95]):
    """盖帽法处理异常值
    Args:
    x:pd.Series列,连续变量
    quantile:指定盖帽法的上下分位数范围
    """ 
    # 生成分位数
    Q05, Q95=x.quantile(quantile).values.tolist()
    # 替换异常值为指定的分位数
    if Q05 > x.min():
        x = x.copy()
        x.loc[x<Q05] = Q05
    if Q95 < x.max():
        x = x.copy()
        x.loc[x>Q95] = Q95
    return(x)

train_data6 = train_data5[per_columns]
train_data6 = train_data6.apply(cap)
train_data7 = pd.concat([train_data5[['CustomerID', 'SeriousDlqin2yrs']], train_data6], axis=1)
train_data7 = train_data7[train_data5.columns]
train_data7.describe()

在这里插入图片描述

方法二:平均值法

def cap_mean(x):
    """盖帽法处理异常值
    Args:
    x:pd.Series列,连续变量
    """ 
    # 生成平均值和标准差的上下界限
    x_up = x.mean() + 3*x.std()
    x_down = x.mean() - 3*x.std()
    # 替换异常值
    if x_down > x.min():
        x = x.copy()
        x.loc[x<x_down] = x_down
    if x_up < x.max():
        x = x.copy()
        x.loc[x>x_up] = x_up
    return(x)

train_data8 = train_data5[per_columns]
train_data8 = train_data8.apply(cap_mean)
train_data9 = pd.concat([train_data5[['CustomerID', 'SeriousDlqin2yrs']], train_data8], axis=1)
train_data9 = train_data9[train_data5.columns]
train_data9.describe()

在这里插入图片描述

11、数据正规化/标准化

from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler

mm_scaler = MinMaxScaler()
ss_scaler = StandardScaler()

print(train_data9['age'].head())
train_data9['age'] = mm_scaler.fit_transform(train_data9[['age']])
print(train_data9['age'].head())

print('-------------------------------------------------')

print(train_data9['MonthlyIncome'].head())
train_data9['MonthlyIncome'] = ss_scaler.fit_transform(train_data9[['MonthlyIncome']])
print(train_data9['MonthlyIncome'].head())

在这里插入图片描述

12、数据泛化(map)

print(cdma['发展渠道小类'].value_counts())
qd_map = {'自营营业厅': '自营渠道', '专营店': '专营渠道', '合作营业厅': '专营渠道', '核心渠道专区专柜':'专营渠道', '天翼小店':'中小渠道',
          '外包营业厅':'专营渠道', '全国连锁卖场': '开放渠道', '全网通(专营)':'专营渠道', '商圈店':'专营渠道', '天翼合作店':'中小渠道', '终端零售店(开放)':'中小渠道'}
cdma_2 = cdma.copy()
cdma_2['渠道统计归类'] = cdma_2['发展渠道小类'].map(qd_map)
print(cdma_2['渠道统计归类'].value_counts())

在这里插入图片描述

13、连续性指派(LabelEncoder)

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
cdma_2['渠道统计归类'] = le.fit_transform(cdma_2[['渠道统计归类']])
cdma_2['渠道统计归类'].value_counts()

在这里插入图片描述

14、数据离散化(cut/qcut)

方法一:人工分离法

age_range = list(range(0,111,10))
train_data5['age_cut1'] = pd.cut(train_data5['age'], age_range, include_lowest=True, right=False)
train_data5['age_cut1'].value_counts().sort_index()

在这里插入图片描述

方法二:等宽装箱法

train_data5['age_cut2'] = pd.cut(train_data5['age'], bins=10, include_lowest=True, right=False, precision=0)
train_data5['age_cut2'].value_counts().sort_index()

在这里插入图片描述

方法三:等深装箱法

train_data5['age_cut3'] = pd.qcut(train_data5['age'], 10, precision=1)
train_data5['age_cut3'].value_counts().sort_index()

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

数据清洗 1.基本概念 数据清洗从名字上也看的出就是把"脏"的"洗掉",指发现并纠正数据文件中可识别 的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。因为数据仓库 中的数据是面向某一主题的数据的集合,这些数据从多个业务系统中抽取而来而且包含 历史数据,这样就避免不了有的数据是错误数据、有的数据相互之间有冲突,这些错误 的或有冲突的数据显然是我们不想要的,称为"脏数据"。我们要按照一定的规则把"脏数 据""洗掉",这就是数据清洗。而数据清洗的任务是过滤那些不符合要求的数据,将过滤 的结果交给业务主管部门,确认是否过滤掉还是由业务单位修正之后再进行抽取。不符 合要求的数据主要是有不完整的数据、错误的数据、重复的数据三大类。数据清洗 问卷审核不同,录入后的数据清理一般是由计算机而不是人工完成。 折叠残缺数据 这一类数据主要是一些应该有的信息缺失,如供应商的名称、分公司的名称、客户 的区域信息缺失、业务系统中主表明细表不能匹配等。对于这一类数据过滤出来,按 缺失的内容分别写入不同Excel文件向客户提交,要求在规定的时间内补全。补全后才写 入数据仓库。 折叠错误数据 这一类错误产生的原因是业务系统不够健全,在接收输入后没有进行判断直接写入 后台数据库造成的,比如数值数据输成全角数字字符、字符串数据后面有一个回车操作 、日期格式不正确、日期越界等。这一类数据也要分类,对于类似于全角字符、数据前 后有不可见字符的问题,只能通过写SQL语句的方式找出来,然后要求客户在业务系统修 正之后抽取。日期格式不正确的或者是日期越界的这一类错误会导致ETL运行失败,这一 类错误需要去业务系统数据库用SQL的方式挑出来,交给业务主管部门要求限期修正,修 正之后再抽取。 折叠重复数据 对于这一类数据--特别是维表中会出现这种情况-- 将重复数据记录的所有字段导出来,让客户确认并整理。 数据清洗是一个反复的过程,不可能在几天内完成,只有不断的发现问题,解决问 题。对于是否过滤,是否修正一般要求客户确认,对于过滤掉的数据,写入Excel文件或 者将过滤数据写入数据表,在ETL开发的初期可以每天向业务单位发送过滤数据的邮件, 促使他们尽快地修正错误,同时也可以做为将来验证数据的依据。数据清洗需要注意的是 不要将有用的数据过滤掉,对于每个过滤规则认真进行验证,并要用户确认。 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息 和形成结论而对数据加以详细研究和概括总结的过程。这一过程也是质量管理体系的支 持过程。在实用中,数据分析可帮助人们作出判断,以便采取适当行动。 类型 在统计学领域,有些人将数据分析划分为描述性统计分析、探索性数据分析以及验 证性数据分析;其中,探索性数据分析侧重于在数据之中发现新的特征,而验证性数据分 析则侧重于已有假设的证实或证伪。 探索性数据分析是指为了形成值得假设的检验而对数据进行分析的一种方法,是对 传统统计学假设检验手段的补充。该方法由美国著名统计学家约翰·图基(John Tukey)命名。 定性数据分析又称为"定性资料分析"、"定性研究"或者"质性研究资料分析",是指 对诸如词语、照片、观察结果之类的非数值型数据(或者说资料)的分析。 数据挖掘(英语:Data mining),又译为资料探勘、数据采矿。它是数据库知识发现(英语:Knowledge- Discovery in Databases,简称:KDD)中的一个步骤。数据挖掘一般是指从大量的数据中自动搜索隐藏 于其中的有着特殊关系性(属于Association rule learning)的信息的过程。数据挖掘通常计算机科学有关,并通过统计、在线分析处 理、情报检索、机器学习、专家系统(依靠过去的经验法则)和模式识别等诸多方法来 实现上述目标。 折叠数据挖掘的基本步骤 数据挖掘的步骤会随不同领域的应用而有所变化,每一种数据挖掘技术也会有各自 的特性和使用步骤,针对不同问题和需求所制定的数据挖掘过程也会存在差异。此外, 数据的完整程度、专业人员支持的程度等都会对建立数据挖掘过程有所影响。这些因素 造成了数据挖掘在各不同领域中的运用、规划,以及流程的差异性,即使同一产业,也 会因为分析技术和专业知识的涉入程度不同而不同,因此对于数据挖掘过程的系统化、 标准化就显得格外重要。如此一来,不仅可以较容易地跨领域应用,也可以结合不同的 专业知识,发挥数据挖掘的真正精神。 数据挖掘完整的步骤如下: 理解数据和数据的来源(understanding)。 获取相关知识技术(acquisition)。 整合检查数据(integration and checking)。 去除错误或不一致的数据(data cleaning)。 建立模型和假设(mod
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值