pythonq清洗数据集经典案例

####################读取数据======================================================
import pandas as pd
import numpy as np
d1 = pd.read_excel('C:\Users\xn084037\Desktop\清洗数据集.xlsx',sheetname='一级流量')
d1.head(2)

d2 = pd.read_excel('C:\Users\xn084037\Desktop\清洗数据集.xlsx',sheetname='二级流量')
d2.head(2)

d3 = pd.read_excel('C:\Users\xn084037\Desktop\清洗数据集.xlsx',sheetname='三级流量')
d3.head(2)
##########################清洗------01增——拓展数据维度

1.1 纵向合并

这三个sheet的数据,维度完全一致(每列数据都是一样),纵向合并起来分析十分方便。说到纵向合并,concat大佬不请自来,他的招式简单明了——pd.concat([表1,表2,表3]),对于列字段统一的数据,我们只需把表依次传入参数:

df_concat = pd.concat([d1,d2,d3])
df_concat

concat大佬继续说到:“其实把我参数axis设置成1就可以横向合并.."说时迟那时快,我一个箭步冲上去捂住他的嘴巴“牛逼的人做好一件事就够了,横向的就交给merge吧~”

小Z温馨提示:pandas中很多函数功能十分强大,能够实现多种功能,但对于萌新来说,过多甚至交叉的功能往往会造成懵B的状态,所以这里一种功能先只用一种方式来实现。

1.2 横向合并

横向合并涉及到连接问题,为方便理解,我们构造一些更有代表性的数据集练手:

h1 = pd.DataFrame({'语文':[93,80,85,76,58],'数学':[87,99,95,85,70],'英语':[80,85,97,65,88]},
index =['韩梅梅','李雪','李华','王明','铁蛋'])
h1

h2 = pd.DataFrame({'篮球':[93,80,85,76],'舞蹈':[87,99,95,85]},
index= ['李华','王明','铁蛋','刘强'])
h2

两个DataFrame是两张成绩表,h1是5位同学的数学、英语、语文成绩,h2是4位同学的篮球和舞蹈成绩,现在想找到并合并两张表同时出现的同学及其成绩,可以用merge方法:

pd.merge(left=h1,right=h2,left_index=True,right_index=True,how='inner')

我们来详解一下merge的参数,left和rgiht分别对应着需要连接的左表和右表,这里语数外成绩表是左表,篮球、舞蹈成绩是右表。

left_index与right_index是当我们用索引(这两个表的名字在索引中)连接时指定的参数,设置为on表示用该表的索引作为连接的条件(或者说桥梁)。假设姓名是单独的一列值,且需要根据姓名进行匹配,那就需要用“left_on = '姓名',right_on = '姓名'”,我们可以分别指定左表的匹配列和右表的匹配列。

how是指定连接方式,这里用的inner,表示我们基于姓名索引来匹配,只返回两个表中共同(同时出现)姓名的数据。下面详解一下inner还涉及到的其他参数——left,right,outer。

左连接(left)和右连接(right),我们可以直观理解为哪边的表是老大,谁是老大,就听谁的(所有行全部保持),先看左连接,左表h1原封不动,右边根据左表进行合并,如果存在相关的名字,就正常返回数据,如果不存在(韩梅梅、李雷),就返回空(NAN)值;右连接就是听右表的,左表有则返回无则为空。

外连接是两张表妥协的产物,我的数据全保留,你的也全保留,你有我无的就空着,你无我有的也空着。

02删——删空去重

2.1 删空

在一些场景,源数据的缺失(空值)对于分析来说是干扰项,需要系统的删除。上文我们合并后的df数据集就是有缺失数据的:

要删除一些空值,一个dropna即可搞定

df_concat.dropna()

dropna函数默认删除所有出现空值的行,即只要一行中任意一个字段为空,就会被删除。我们可以设置subset参数,例如dropna(subset = ['city']),来指定当一行中的city字段为空时,才会被删除。

df_concat.dropna(subset = ['客单价'])

2.2 /去重

说是讲去重,但是案例数据比较干净,没有两行数据是完全一样的,所以我们要制造点困难,增加几行重复值:

repeat = pd.concat([df_concat,df_concat])
print('重复的数据集一共多少行:',len(repeat))

把源数据重复两遍,赋值给repeat,这样每一行数据都有重复的数据。要把重复数据删掉,一行代码就搞定:

unique = repeat.drop_duplicates()
print('去重后的数据集一共多少行:',len(unique))
unique

drop_duplicates方法去重默认会删掉完全重复的行(每个值都一样的行),如果我们要删除指定列重复的数据,可以通过指定subset参数来实现,假如我们有个奇葩想法,要基于“流量级别”这列进行去重,则可以:

df_concat.drop_duplicates(subset='流量级别')

我们会发现,流量有三个级别,通过指定subset参数,我们删除了这个字段重复的行,保留了各自不重复的第一行。继续展开讲,在源数据中,流量渠道为“一级”的有7行数据,每行数据其他字段都不相同,这里我们删除了后6行,只保留了第一行,但如果我们想在去重的过程中删除前面6行,保留最后一行数据怎么操作?答案很简单,指定keep参数即可。

df_concat.drop_duplicates(subset='流量级别',keep='last')

keep值等于last,保留最后一行数据,不输入keep值时,系统默认会给keep赋值为first,就会保留第一行数据而删掉其他的。

******************03 查——基于条件查询*********************************

查,不是单纯的返回几行数据,而是根据业务实际需求,基于一定的条件查看和选择数据。

3.1 按条件索引/筛选

loc独白:你没有看错,哥的分量实在是太重了,所以又来抢个沙发,刷个脸熟。

这次需求是筛选出访客数大于10000的一级渠道,loc一下:

df_concat.loc[(df_concat['访客数']>10000)&(df_concat['流量级别']=='一级'),:]

在行参数设置好同时满足访客数大于10000和流量级别等于“一级”这两个条件即可。

3.2 排序

很多情况下,我们都需要通过排序来观察数据规律,以及快速筛选出TOP N的数据项。对于案例数据,我们怎么样按交易金额进行排序并筛选出TOP3的渠道呢?

问题的关键就在于排序,这个时候sort_values函数就派上用场了:

sort_df= df_concat.sort_values('支付金额',ascending=False)
sort_df

整个操作十分简单,sort_values函数,顾名思义是按照数值进行排序,首先要传入的参数是列参数,即我们根据哪一列的数值来进行排序,ascending参数决定了排序顺序,等于Flase则是从大到小的降序,设置为True则是升序。

补充一个知识点,如果跟着文章操作,会发现无论是删空的dropna,还是去重的drop_duplicates,或者是排序的sort_values,在对源数据进行操作后,源数据并未改变,这是因为我们没有对这几个函数的inplace值进行设置,如果设置成inplace = True,删空、去重和排序都会在源数据上生效。

但这里为了避免出现不必要的错误而无法更改,更建议大家把操作后的源数据赋值给新的变量,如new = df.dropna(),而不是将源数据的inplace参数设置为True。

*********************04 分——分组和切分************************************

4.1分组

在案例数据中,总的流量级别有三级,每一级下又有多个投放地区,如果我们想汇总看每个级别流量所对应的总访客数和支付金额,就需要用到分组了。

groupby是分组函数,最主要的参数是列参数,即按照哪一列或者哪几列(多列要用列表外括)进行汇总,这里是按照流量级别:

df_concat.groupby('流量级别')

可以看到,直接分组之后,没有返回任何我们期望的数据,要进一步得到数据,需要在分组的时候对相关字段进行计算(常用的计算方法包括sum、max、min、mean、std):

df_concat.groupby('流量级别').sum()
df_concat.groupby('流量级别').sum()

后面加上了sum,代表我们先按照流量级别进行分组,再对分组内的字段求和。由于没有指定求和的列,所以是对所有数值型字段进行了求和。此处我们只想要各级别流量下的访客数和支付金额,需要指明参数:

df_concat.groupby('流量级别')['访客数','支付金额'].sum()

流量级别作为汇总的依据列,默认转化为索引列,如果我们不希望它变成索引,向groupby内传入参数as_index = False即可:

df_concat.groupby('流量级别',as_index=False)['访客数','支付金额'].sum()

4.2切分

切分(分桶)操作常用于一维数组的分类和打标,cut函数能够高效的完成任务。它的主要参数和用法如下:

pd.cut(x,bins,right,labels)

不要被复杂的解释迷惑,一个例子就完全搞懂了。

以案例数据为例,每个渠道都有对应的访客数,我们现在希望对各渠道访客级别进行评估,按照访客数大小,分成辣鸡(流量100以内的)、百级、千级和万级的渠道。

pd.cut(x=df_concat['访客数'],bins=[0,100,1000,10000,100000])

因为我们想对流量级别进行百、千、万的归类,所以把分组数值标准传入bins参数。从结果可以看到,在不设置right的情况下,分组区间是默认左开右闭的,而我们希望的是左闭右开,即百级流量渠道访客数在0-99之间,所以需要将right值设置为False。

下面我们直接对分组后的数据进行打标,访客数在0-99设置为“辣鸡”,100-999设置为百级,千级和万级以此类推,同时将打好标签的数据作为新列给到源数据:

df_concat['分类打标']= pd.cut(x=df_concat['访客数'],bins=[0,100,1000,10000,100000],
right=False,labels=['辣鸡','百级','千级','万级'])
df_concat

非常高效,一行半代码就搞定了分组、判断和打标的过程。

总结

本文从增、删、查、分四个模块,分别介绍了横向、纵向合并;删空、去重;筛选、排序和分组、切分等数据清洗过程中的常见操作。在实际运用中,各操作往往是你中有我,我中有你,共同为了营造一个“干净”的数据而努力。

###################Pandas将多个Sheet写入到本地同一Excel文件中
import pandas as pd #读取两个表格data1=pd.read_excel('文件路径')
data2=pd.read_excel('C:\Users\xn084037\Desktop\副本三代核心系统入账金额异常结果数据.xlsx')#将两个表格输出到一个excel文件里面
data1=pd.read_excel('C:\Users\xn084037\Desktop\副本三代核心系统入账金额.xlsx')#将两个表格输出到一个excel文件里面
writer=pd.ExcelWriter('D:新表.xlsx')
data1.to_excel(writer,sheet_name='sheet1')
data2.to_excel(writer,sheet_name='sheet2') #必须运行
writer.save()#不然不能输出到本地writer.save()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,448评论 0 13
  • pandas官方文档:http://pandas.pydata.org/pandas-docs/stable/ap...
    肖月_1d28阅读 6,133评论 2 6
  • Pandas是基于Numpy的一种工具,这个工具是为了解决数据分析任务而创建的,pandas纳入了大量的库和一些标...
    CDA数据分析师培训阅读 542评论 0 9
  • 最近常有朋友好奇地问我,你现在每天在干什么呢,我都笑吟吟地回答我现在在经营一家惠量书房,书房每天都有各种各样的活动...
    圆梦成长进步营阅读 316评论 2 1
  • 终于我们都放弃 别问有没有珍惜 时光倒流也找不回那份纯 只有曾经我无法忘记 抹去你爱的痕迹 还你自由的权利 多年以...
    清勇卢追阅读 180评论 1 1