pandas数据骚操作总结

所需积分/C币:50 2019-02-17 17:20:05 940KB PDF
59
收藏 收藏
举报

pandas在工作中的使用总结,以及使用pandas进行特征工程比较常用的方法总结。
mport pandas as pd inport rng=np. random. Randomstate(o) df=pd DataFrame(i'key: list('ABCABC), 'datal : range(6), nge randint(0, 10, 6)]) print(df) df min(axis=o), df. max(axis=0), df. unique(axis=0) df. described df. info( Pandas对数据的基本操作 查找 1.切片方式:类似 python中ist的操作方法:df3:] 2.ioc函数操作方法; df locl:,[1,2,3],按照行列切片的方式进行选择数据 3.loc函数操作方法: df. loc,列名]行按照切片的方式进行选择,列要按照列名进 行选择 4.按条件查找方法:d件,例如查找为空的数: df[df[a"]isnu(,这里要注意一点 的是,如果数据类型是 Series格式的,它支持 numpy那种数据过滤方法,例 如:dfdf>3] 5.这里有一点就是有时数据需要输岀偶数列的数据,有用到这种写法d「iloc[:2, 其中第一个里面为:2代表的意思是从开始到最后,每隔2输出数据。 删除 1.删除空值:df. drona( 2.删除以行列数据: df drop(,其中axis=0,1用于调节按行还是按列,如果想要批 量的删除行数据,可参考操作: drop index=df!件] index. tolist((df= df drop( drop index, axis=0) 3.按条件删除数据:df=df条件] 插入 1.插入一行或一列数据: df. insert() 2.将表中数据的某个值替换为其它的值:df, replace(old,new) 排序 1.对 DataFrame类型的数据的行列进行排序: df sort values(a',"b,c], ascending= False, False,True]),对列a,b,c按照不同的排序方式进行排序 列名的重新命名 1. df. rename( old name:' new name"},axis=1, inplace=True)对文件的某些列进行重 新命名 2. dt. columns=[a',b]直接对个文件的列进行重新命名 Pandas对空值(NaN)的骚操作 我们在实际工作以及数据挖掘的一些比赛中,数据的缺失是大概率的事,对于数据分析与 数据建模时,缺失值的分析与处理对后续的结论十分重要,故下面介绍,个人目前为止在 空值上遇到的一些常用骚操作。 查看数据中行与列的空值比例 表中为空的数据(有时候做数据分析的时候当处理完空值时,需要查看是否还存在空 值) ·空值的填充 查看一列中的空值数据,一种是dfta]isnu(还有一种方法是 pd isnull(dfra]),当只 在一列中进行操作时建议使用第一种方法,当需要进行多列交叉操作时,建议使用第 二种方法。 import pandas as pd import numpy as np 查看各行各列的空值 1.查看表中各行各列中得缺失比例 F: df. count(axis=0)/df shape [o], at df. count(axis=0)/df. loc[:, 0]. size fr: df. count(axis=1)/df shape [1], t df. count(axis=1)/df. loc[o,: ]. size 2.某列中为空的数据 dfldfl' clos name.isnull(1 #查看表中是否还存在空值 dfldf. isnull(. values] 操作解释,对 pandas数据支持True,和 False的形式进行提取数据, df. isnull() values是个与df相同行和列的 array格式,因此,可以通过df[条件] 提取出为True测数据 #空值的填充函数df, fillna() 1.df, fillna(df.mean(),axis=),一次对所以的空值按照列的均值进行填充 2. df. fillna(['coll'df['coll] mean (), 'col2: [df[ col2 ]. median (]]), 对不同的列按照不同的方式进行填充 Pandas对重复数据的骚操作 有时候在工作中从平台数据上提取上干万行不同的数据时,由于提取的失误,可能会越到 重复的数据,当有重复的数据时对后面的表拼接,以及 groupby操作会带来麻烦,个人目 前遇到的重复值的一些骚操作。 删除重复值 当数据量很大时,我们有时候想要知道哪些数据是重复的,好来查找重复的原因 删除数据中的重复项数据 df. drop_duplicated()#有 subset,keep等参数可以选择,对哪些列重复数据 违行操作,保留最重复项中的哪一个 输出所以数据中重复的数据 df[df, duplicated()],原理和上述输出空值差不多,都是将重复的数据转为True 和Fase来提取为True的数据 Pandas对索引以及数据的行列转换骚操 作 有时候在做数据分析的时候,可能数据的 shape不是我们想要的形式,不要慌,神奇的行 列互换骚操作帮你解忧 将数据的列旋转为行: stack 将数据的行旋转为列: unstack ·在介绍上述的两个函数之前,先得对 pandas数据格式得索引有一定得了解回比较容易 发挥这两个函数得强大功能,个人感觉可以将其理解为数据的一种 Hashmap,如下图 片中左边的红色框中为一层索引需要注意的是索引可以重复,这个和字典中的key- value 的不同之处,右边的为两层索引,如果使用行列转换函数不设置索引的话,会使用默认 的索引(0,1,2.…)这样也发挥不出行列转换函数的作用,大家如果用到过 pandas那 个创表的神奇函数 pivot,可以去看它的源代码其核心这就是这两个函数的转换 ila number state a0.0NaN number。netw。 three b Nan 3.0 state twO 1.0 NaN b NaN 4.0 b34 three 2.0 NaN b NaN 5.0 #行列翻转函数 df pd DataFrame(np arange(6).reshape((2, 3)) columns=pd Index(['one, 'two,'three], name='number i)) df insert(2,flag,['x,y]) df insert(2, 'state,['a,'b]) result=df,set_ index([' state','fLag"])#设置多层索引 result. unstack( level=9)将第2层索引翻转为列,-1为第一层索引 这个翻转函数在进行特征工程的时候经常会用到: 1.当有两层行索引的时候,如果想要去掉设置的索引改为默认的直接重设即可 df reset_index() 2.当有两层列索引的时候,往往进行特征提取的时候,需要将多张表进行 meger 或者 concat,这个时候表的 columns都是单层的,这个时候可以使用 rave1骚函数或者将其转为元组类型的List,将多层的表转换为单层的表 pair s= df column L() df columns [str(i)+ str(j) for i, j in pair_cols] Pandas对宇符串类型列的骚操作 pandas将字符串类型的 series数据封装的已经很好了,基本字符串该有的增删查改调 控等操作都有相应的函数接口,目前工作中还没有遇到那些函数解决不了的问题,以 后遇到了在更新内容,当遇到字符串相关的问题时,请点击这里即可:字符串 Pandas对某列中不同数据类型的骚操作 在实际工作中,由于数据采集的失误或者人工处理的时候不当,会造成原始数据类型 经常会遇到一列数值型数据中,混杂一些字符串类型的数据,当我们要对这列数据进 行统计运算时,就会报相应的错误,当遇到这样问题的时候,如果我们是在进行数据 分析,需要找出具体是哪些行存在这样的问题,从而去修改原始数据的釆集,而在进 行数据建模或者特征提取时,需要对其进行删除或者釆用均值数据进行修改,具体的 骚操作方法如下: #找出数值型数据中混杂的字符串数据的操作方法 df [pd isnull(pd to_numeric(df['closl'], errors=' coerce ))] 操作解释,使用pd.to_ numberic(df['cLos1], errors=' coerce')函数将不是数值 型的数据赋值为NaN,关键在于设置参数 errors,然后使用pd. isnuLL()函数将为NaN的数 据转换为True, False标签通过[]方式进行提取 ·特征工程中经常需要对数据类型进行转换 pandas中 astype可以为你解忧,在nlp比赛 中各列的数据差异比较大时,需要选择所需的数据类型则可以使用 select dtypes: #如果coL1列为数值的字符串类型,可以用 astype( float32)转为浮点型 df[coll]= df[coll]. astype(float32) #如果coL不是字符中类型,但是想使用字符串的运算,可以用 astype(str)转为字符串类型 df[coll ] df[coll"]. astype(str) 井选择各列数据类型为数值型的数据,以及删除某个类型的数据 need- type =[int16 t32,int64,'float16,float32,'float64' df df select_dtypes(include=need_type) delete type =[lint df= df. select dtype(exclude=delete type) Pandas之 grouped最强骚操作 如果要说上面介绍的一些 pandas的基本操作大部分 execl厉害的人也能实现,个人感觉 pandas处理数据贼有魅力的地方在于它的聚合分组统计操作,这也是在数据建模中特征提 取用的最多的地方,在特征提取时,经常需要提取样本分组的统计信息特征,因此,把这 方面的骚操作掌握好了,不仅可以提升数据分析的质量,同时两个不同的操作在效率上也 是数倍甚至几十倍的差距,在介绍 groupby之前先介绍几个骚函数 map:只能对一列数据进行操作,且不能和 groupby进行结合操作 ·agg:能够与 groupby结合操作,但是时一列一列的输岀数据的,因此,改方法不能修 改在 groupby后修改数据,但是它的优点在于可以对多个列数据进行多个不同的基本统 计信息(sum, count,min,max等) transform:能够与 groupby结合操作,这个函数的优点就是不改变数据的形述来进行 分组统计,数据即是多行多列也是一行一列进行输出的,但是虽然是多行多列的输 ,不能够在 transform内部调用某列进行操作:只能先选择某列在进行操作。 ·appⅣy:能够与 groupby结合操作,输岀了多行多列的数据,因此可以对数据提取某列 进行操作,上述骚函数中, apply函数的功能最为强大,只有你想不到的,没有它做不 到的。 查看 groupby后内部数据结构是什么样的操作方法 1. apply: df groupby ('a).apply (lambda x: print(x)) 2.agg: df groupby (a ). agg(lambda x: print(x)) 3. transform: df groupby ('a). trans form(lambda x: print(x)) 对比分析 函数 应用场景 优点 缺点 map单列数据进行简单操作 快速 功能有限,不能和 groupby结合 agg提取数据各列的统计信支持多列不同操作,快速进行不能进行列交叉操作 息 数据统计 transfrom小量数据,不想改变数 不改变数据类型 速度贼慢 据形状 apply 切agg解决不了的问 设计性强 需要对过程结果很熟悉 题 上述骚函数操作比较 单列数据处理的比较map和 np. where(),当数据量很小时,随便用哪种操作影响不 大,但是当数据量大的时候,就需要你在时间和空间复杂度中去选择哪个, np. where 函数的执行速度会比map和 apply函数快上好几倍,其是通过空间换时间的做法,因 此,在使用时需要考虑电脑内存,个人暂时还没遇到使用这个函数内存崩了的情况 #例如当我们对表中某列数据按阈值进行分6和1类别时,可用如下操作 df['a]= df['a ]. map(lambda x: 1 if 5 else 0) df[la'l where(dfa l> ·多列数据处理比较 apply与np. where(),性能比较和单列一样,有一点的需要注意的 是, apply函数使用多列进行交叉操作时,需要设置参数axis=1,这个很关健,干万 记得在多列交叉操作时,要设置axis参数 #例如当我们对表中将列a为空的赋值为列b的值,其它的保持不变,具体操作如下 df['a =df apply (lambda ['b if pd isnull(x['a) else x['a’],axis=1) 2, df['a'l= np. where (pd isnull(df['a1), df['b'l, df['a'l) Groupby 在进行特征工程时,经常需要按照一定的规则进行统计特征提取,这个 gropuby操作和 hadoop的 mapreduce有一定的相似, groupby可以理解为对数据进行拆分再进行应用再 进行合并,当理解了之前介绍的几个骚函数以及一些常用的统计函数然后如果能想象的到 groupby之后的数据结构,基本就可以开始你无限的骚操作了,不管是解决产品经理的数 据报告需求还是特征提取甚本问题不大了,下面介绍一些个人比较喜欢用的操作: 对 Dataframe数据进行 Groupby之后,可以直接一些简单的统计操作,基本上该有的 统计函数都有封装,如果只要統计某列,只需将 groupby后的数据取出那一列进行相 应的操作就可以, groupby后的属性函数请点击查看 #按照列a数据分组统计其它列的均值 df groupby('a) mean() 按照列a数据分组统计其列b的均值 df groupby ('a)['b'1 mean() ·一个基本操作的优雅性与效率 df pd DataFrame(i'key1:[' ' key2 :['one',Itwo,'one, two onw I datal: np. random randn(5), I data2: np. random randn(5)3) 对上述的表按照key1,key2分组统计data1的均值的两种写法: 1. dfr'datal'l groupby([df['key1'l, df['key2'11) count() df groupby(['key1,'key2)['datal']. count() 经过对上述的两段代码进行性能测试可以发现,第二段代码相对于第一段代码性能更优,在执行的 时间复杂度上有一定的优势。第一段代码可以解释为,取df表中data1字段按照key1,key2字段进 行统计,而第二段代码是先对df表中的key1,key2字段进行分组,然后取data1字段进行统计,个 人更习惯于第二段代码不仅更好理解,同时写起米更加的优雅 groupby结合上述几个骚函数进行分组统计信息的使用总结,如果能使用 llam bda表达 式完成的,尽量使用 ambda表达式而不去写一个函数 #按照列a数据分组统计其列b的均值,求和并修改名字且名字前缀为 hello df groupby ('a'['b].agg(['b_mean ' ' mean' b_sum: 'sums).add__prefix( hello_') 其中ad_ prefix属性用于给列添加前缀,如果是要对行添加前缀则需要使用 app ly函数 将 groupby与 apply结合起来进行自定义函数设计(需要传入参数的写法),不要传入 #参数使用1 ambda表达式即可完成 1.按照列a进行 groupby取列b中值最大的n个数 def the_top-values (data, n=3, cols_name=b): return data sort_values(b )l:n] f groupby ('a).apply(the_top-values, n=3, clos_name=b 在进行特征工程时,我们经常需要对一种重要的数值型数据进行分箱操作,因为分箱 后能大幅度提升模型的拟合效果以及过拟合的危险,特征工程中对于数值型数据进行 分箱离散化操作以及操作后统计特征的优雅骚写法: 对于分箱操作,在处理连续数据的特征工程时经常会用到,特别是在用户评分模型里 面用的贼多,但是使用最优分箱进行数值离散化比较多,由于本文不是重点介绍特征 工程的,后续会写相关的文档,因此,这里不重点进行介绍,读者如果感兴趣可以去 查阅相关的知识,也可以关注我的公众号和微信获取code和data。 #例如想要对数值型数据a分成4个箱子,然后分别统计每个箱子里面b列的最大值,均值以及个数 def help_static(group) return i'min': group. max(),' max ':group mean(), count: group. count()I bins 1 =p d.cut(df['a'],4, abels= False)#为等距分箱 bins_2=pd,qcut(df['a'],4, abels= False)#等频分箱 temp df['b'] groupby(bins). apply(help_static). unstack() 操作介绍,首先定义箱子规则bins,然后取df["b']按照箱子分组统计每个箱子 里面b的统计特征 然后再将temp与df进行拼接,就可以得到每个箱了里面的统计特征 分组对空值NaN进行填充 #对于空值,在进行特征工程时,如果空值缺比较多的时候,常将这列除,如果缺的20%左右 要不就不对其进行处理,将它当做一和情况看待,或者对空值进行填充,为了更加的使填充值得淏差 尽可能得小,如果一个id有多条样本,则可以对其进行分组后在填充,不然就用整体分布值进行填 #对列a分组后对列b中的空值用用中位数填充 fuc_nan lambda x: X. fillna(x median()) df groupby (a)['b]apply(fuc_nan).reset_index(). drop('level-1', a 对某列数据按照线性或者多项式的方法进行缺失数据的填充 func_ nan lambda x: x interpolate( df groupby ('a).['b]. apply (fuc_nan).reset__(. drop(i'level_l',ax is=1) pandas进行数据分析与特征提取的时候, groupby加上 apply操作拥有无限的可能,只有 你不会优雅用的,没有操作不出来的 Pandas多个文件的拼接骚操作 在进行数据分析与特征工程时,经常需要将多张表进行各种拼接连接,利用 pandas进行表 连接与sq写法差不多,总结起来就是按行还是按列连接,选一个字段,所以这方面美啥太 多问题,只要注意几个地方,就问题不大 将两张表按照某字段进行左右内外连接:pd. merge0 ·不按照字段将表进行按行按列拼接: pd concat(() 将表 trian和表test按照列'a'进行左连接 1. train merge(test, on='key', how='left 2. pd merge(train, test, on=lkey, how= left) 个人比较喜欢用第种写法,看上去感觉漂亮点,性能上没啥区别,看个人喜爱 #对表 train和表test按行/列进行拼接 按行进行拼接的两种写法 1. train append(test, ignore_index=True) 2.pdconcat([train, test], axis=0, ignore- index=True. 性能上没啥差别,个人比较喜欢用第·种,看上去简洁“点, 但是第二种貌似容易理解一点,看个人喜好 按列进行拼接 pd concat([train, test], axis=l, ignore_index=True) Pandas的高效性能骚函数 pandas进行列的查询,经常会常使用df条件]的方式,但是这种写法的性能不是很高, pandas基于 Numexpr实现了两个高性能的函数,用于数据查询过滤 query(和数据列值修 改与增加新列eva(),这两个函数通过传入列名str的方式进行操作 #过滤表中列a的值大于3且列b的值小于5的数据的两种写法

...展开详情
试读 13P pandas数据骚操作总结
立即下载
限时抽奖 低至0.43元/次
身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
关注 私信
上传资源赚钱or赚积分
最新推荐
pandas数据骚操作总结 50积分/C币 立即下载
1/13
pandas数据骚操作总结第1页
pandas数据骚操作总结第2页
pandas数据骚操作总结第3页

试读结束, 可继续读1页

50积分/C币 立即下载