安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

Pandas处理大数据的性能优化技巧

7月19日 碎骨族投稿
  Pandas是Python中最著名的数据分析工具。在处理数据集时,每个人都会使用到它。但是随着数据大小的增加,执行某些操作的某些方法会比其他方法花费更长的时间。所以了解和使用更快的方法非常重要,特别是在大型数据集中,本文将介绍一些使用Pandas处理大数据时的技巧,希望对你有所帮助
  数据生成
  为了方便介绍,我们生成一些数据作为演示,faker是一个生成假数据的Python包。这里我们直接使用它importrandomfromfakerimportFakerfakeFaker()carbrands〔Audi,Bmw,Jaguar,Fiat,Mercedes,Nissan,Porsche,Toyota,None〕tvbrands〔Beko,Lg,Panasonic,Samsung,Sony〕defgeneraterecord():generatesafakerowcidfake。bothify(textCID)namefake。name()agefake。randomnumber(digits2)cityfake。city()platefake。licenseplate()jobfake。job()companyfake。company()employedfake。boolean(chanceofgettingtrue75)socialsecurityfake。boolean(chanceofgettingtrue90)healthcarefake。boolean(chanceofgettingtrue95)ibanfake。iban()salaryfake。randomint(min0,max99999)carrandom。choice(carbrands)tvrandom。choice(tvbrands)record〔cid,name,age,city,plate,job,company,employed,socialsecurity,healthcare,iban,salary,car,tv〕returnrecordrecordgeneraterecord()print(record)〔CID753,KristyTerry,5877566,NorthJessicaborough,988XEE,Engineer,controlandinstrumentation,Braun,RobinsonandShaw,True,True,True,GB57VOOS96765461230455,27109,Bmw,Beko〕
  我们创建了一个100万行的DF。importosimportpandasaspdfrommultiprocessingimportPoolN1000000ifnamemain:cpusos。cpucount()poolPool(cpus1)asyncresults〔〕forinrange(N):asyncresults。append(pool。applyasync(generaterecord))pool。close()pool。join()data〔〕fori,asyncresultinenumerate(asyncresults):data。append(asyncresult。get())dfpd。DataFrame(datadata,columns〔CID,Name,Age,City,Plate,Job,Company,Employed,SocialSecurity,Healthcare,Iban,Salary,Car,Tv〕)
  磁盘IO
  Pandas可以使用不同的格式保存DF。让我们比较一下这些格式的速度。Writetimeitdf。tocsv(df。csv)3。77s339msperloop(meanstd。dev。of7runs,1loopeach)timeitdf。topickle(df。pickle)948ms13。1msperloop(meanstd。dev。of7runs,1loopeach)timeitdf。toparquet(df)2。77s13msperloop(meanstd。dev。of7runs,1loopeach)timeitdf。tofeather(df。feather)368ms19。4msperloop(meanstd。dev。of7runs,1loopeach)defwritetable(df):dtfdt。Frame(df)dtf。tocsv(df。csv)timeitwritetable(df)559ms10。1msperloop(meanstd。dev。of7runs,1loopeach)
  Readtimeitdfpd。readcsv(df。csv)1。89s22。4msperloop(meanstd。dev。of7runs,1loopeach)timeitdfpd。readpickle(df。pickle)402ms6。96msperloop(meanstd。dev。of7runs,1loopeach)timeitdfpd。readparquet(df)480ms3。62msperloop(meanstd。dev。of7runs,1loopeach)timeitdfpd。readfeather(df。feather)754ms8。31msperloop(meanstd。dev。of7runs,1loopeach)defreadtable():dtfdt。fread(df。csv)dfdtf。topandas()returndftimeitdfreadtable()869ms29。8msperloop(meanstd。dev。of7runs,1loopeach)
  CSV格式是运行最慢的格式。在这个比较中,我有包含Excel格式(readexcel),因为它更慢,并且还要安装额外的包。
  在使用CSV进行的操作中,首先建议使用datatable库将pandas转换为datatable对象,并在该对象上执行读写操作这样可以得到更快的结果。
  但是如果数据可控的话建议直接使用pickle。数据类型
  在大型数据集中,我们可以通过强制转换数据类型来优化内存使用。
  例如,通过检查数值特征的最大值和最小值,我们可以将数据类型从int64降级为int8,它占用的内存会减少8倍。
  df。info()classpandas。core。frame。DataFrameRangeIndex:1000000entries,0to999999Datacolumns(total14columns):ColumnNonNullCountDtype0CID1000000nonnullobject1Name1000000nonnullobject2Age1000000nonnullint643City1000000nonnullobject4Plate1000000nonnullobject5Job1000000nonnullobject6Company1000000nonnullobject7Employed1000000nonnullbool8SocialSecurity1000000nonnullbool9Healthcare1000000nonnullbool10Iban1000000nonnullobject11Salary1000000nonnullint6412Car888554nonnullobject13Tv1000000nonnullobjectdtypes:bool(3),int64(2),object(9)memoryusage:86。8MB
  我们根据特征的数值范围对其进行相应的转换,例如AGE特征的范围在0到99之间,可以将其数据类型转换为int8。intdf〔Age〕。memoryusage(indexFalse,deepFalse)8000000convertdf〔Age〕df〔Age〕。astype(int8)df〔Age〕。memoryusage(indexFalse,deepFalse)1000000floatdf〔SalaryAfterTax〕df〔Salary〕0。6df〔SalaryAfterTax〕。memoryusage(indexFalse,deepFalse)8000000df〔SalaryAfterTax〕df〔SalaryAfterTax〕。astype(float16)df〔SalaryAfterTax〕。memoryusage(indexFalse,deepFalse)2000000categoricaldf〔Car〕。memoryusage(indexFalse,deepFalse)8000000df〔Car〕df〔Car〕。astype(category)df〔Car〕。memoryusage(indexFalse,deepFalse)1000364
  或者在文件读取过程中直接指定数据类型。dtypes{CID:int32,Name:object,Age:int8,。。。}dates〔DateColumnsHere〕dfpd。readcsv(dtypedtypes,parsedatesdates)查询过滤
  常规过滤方法:timeitdffiltereddf〔df〔Car〕Mercedes〕61。8ms2。55msperloop(meanstd。dev。of7runs,1loopeach)
  对于分类特征,我们可以使用pandas的groupby和getgroup方法。timeitdf。groupby(Car)。getgroup(Mercedes)92。1ms4。38msperloop(meanstd。dev。of7runs,10loopseach)dfgroupeddf。groupby(Car)timeitdfgrouped。getgroup(Mercedes)14。8ms167sperloop(meanstd。dev。of7runs,1loopeach)
  分组的操作比正常应用程序花费的时间要长。如果要对分类特征进行很多过滤操作,例如在本例中,如果我们从头进行分组,并且只看getgroup部分的执行时间,我们将看到该过程实际上比常规方法更快。也就是说,对于重复的过滤操作,我们可以首选此方法(getgroup)。计数
  Valuecounts方法比groupby和followingsize方法更快。timeitdf〔Car〕。valuecounts()49。1ms378sperloop(meanstd。dev。of7runs,10loopseach)Toyota111601Porsche111504Jaguar111313Fiat111239Nissan110960Bmw110906Audi110642Mercedes110389Name:Car,dtype:int64timeitdf。groupby(Car)。size()64。5ms37。9sperloop(meanstd。dev。of7runs,10loopseach)CarAudi110642Bmw110906Fiat111239Jaguar111313Mercedes110389Nissan110960Porsche111504Toyota111601dtype:int64迭代
  在大容量数据集上迭代需要很长时间。所以有必要在这方面选择最快的方法。我们可以使用Pandas的iterrows和itertuples方法,让我们将它们与常规的for循环实现进行比较。deffooloop(df):total0foriinrange(len(df)):totaldf。iloc〔i〕〔Salary〕returntotaltimeitfooloop(df)34。6s593msperloop(meanstd。dev。of7runs,1loopeach)deffooiterrows(df):total0forindex,rowindf。iterrows():totalrow〔Salary〕returntotaltimeitfooiterrows(df)22。7s761msperloop(meanstd。dev。of7runs,1loopeach)deffooitertuples(df):total0forrowindf。itertuples():totalrow〔12〕returntotaltimeitfooitertuples(df)1。22s14。8msperloop(meanstd。dev。of7runs,1loopeach)
  Iterrows方法比for循环更快,但itertuples方法是最快的。
  另外就是Apply方法允许我们对DF中的序列执行任何函数。deffoo(val):ifval50000:returnHighelifval50000andval10000:returnMidLevelelse:returnLowdf〔SalaryCategory〕df〔Salary〕。apply(foo)print(df〔SalaryCategory〕)0High1High2MidLevel3High4Low。。。999995High999996Low999997High999998High999999MidLevelName:SalaryCategory,Length:1000000,dtype:objecttimeitdf〔SalaryCategory〕df〔Salary〕。apply(foo)112ms50。6sperloop(meanstd。dev。of7runs,10loopseach)defboo():liste〔〕foriinrange(len(df)):valfoo(df。loc〔i,Salary〕)liste。append(val)df〔SalaryCategory〕listetimeitboo()5。73s130msperloop(meanstd。dev。of7runs,1loopeach)
  而map方法允许我们根据给定的函数替换一个Series中的每个值。print(df〔SalaryCategory〕。map({High:H,MidLevel:M,Low:L}))0H1H2M3H4L。。999995H999996L999997H999998H999999MName:SalaryCategory,Length:1000000,dtype:objectprint(df〔SalaryCategory〕。map(SalaryCategoryis{}。format))0SalaryCategoryisHigh1SalaryCategoryisHigh2SalaryCategoryisMidLevel3SalaryCategoryisHigh4SalaryCategoryisLow。。。999995SalaryCategoryisHigh999996SalaryCategoryisLow999997SalaryCategoryisHigh999998SalaryCategoryisHigh999999SalaryCategoryisMidLevelName:SalaryCategory,Length:1000000,dtype:objectdf〔SalaryCategory〕df〔Salary〕。map(foo)print(df〔SalaryCategory〕)0High1High2MidLevel3High4Low。。。999995High999996Low999997High999998High999999MidLevelName:SalaryCategory,Length:1000000,dtype:object
  让我们比较一下标对salary列进行标准化工时每一中迭代方法的时间吧。minsalarydf〔Salary〕。min()maxsalarydf〔Salary〕。max()defnormalizeforloc(df,minsalary,maxsalary):normalizedsalarynp。zeros(len(df,))foriinrange(df。shape〔0〕):normalizedsalary〔i〕(df。loc〔i,Salary〕minsalary)(maxsalaryminsalary)df〔NormalizedSalary〕normalizedsalaryreturndftimeitnormalizeforloc(df,minsalary,maxsalary)5。45s15。1msperloop(meanstd。dev。of7runs,1loopeach)defnormalizeforiloc(df,minsalary,maxsalary):normalizedsalarynp。zeros(len(df,))foriinrange(df。shape〔0〕):normalizedsalary〔i〕(df。iloc〔i,11〕minsalary)(maxsalaryminsalary)df〔NormalizedSalary〕normalizedsalaryreturndftimeitnormalizeforiloc(df,minsalary,maxsalary)13。8s29。5msperloop(meanstd。dev。of7runs,1loopeach)defnormalizeforiloc(df,minsalary,maxsalary):normalizedsalarynp。zeros(len(df,))foriinrange(df。shape〔0〕):normalizedsalary〔i〕(df。iloc〔i〕〔Salary〕minsalary)(maxsalaryminsalary)df〔NormalizedSalary〕normalizedsalaryreturndftimeitnormalizeforiloc(df,minsalary,maxsalary)34。8s108msperloop(meanstd。dev。of7runs,1loopeach)defnormalizeforiterrows(df,minsalary,maxsalary):normalizedsalarynp。zeros(len(df,))i0forindex,rowindf。iterrows():normalizedsalary〔i〕(row〔Salary〕minsalary)(maxsalaryminsalary)i1df〔NormalizedSalary〕normalizedsalaryreturndftimeitnormalizeforiterrows(df,minsalary,maxsalary)21。7s53。3msperloop(meanstd。dev。of7runs,1loopeach)defnormalizeforitertuples(df,minsalary,maxsalary):normalizedsalarylist()forrowindf。itertuples():normalizedsalary。append((row〔12〕minsalary)(maxsalaryminsalary))df〔NormalizedSalary〕normalizedsalaryreturndftimeitnormalizeforitertuples(df,minsalary,maxsalary)1。34s4。29msperloop(meanstd。dev。of7runs,1loopeach)defnormalizemap(df,minsalary,maxsalary):df〔NormalizedSalary〕df〔Salary〕。map(lambdax:(xminsalary)(maxsalaryminsalary))returndftimeitnormalizemap(df,minsalary,maxsalary)178ms970sperloop(meanstd。dev。of7runs,10loopseach)defnormalizeapply(df,minsalary,maxsalary):df〔NormalizedSalary〕df〔Salary〕。apply(lambdax:(xminsalary)(maxsalaryminsalary))returndftimeitnormalizeapply(df,minsalary,maxsalary)182ms1。83msperloop(meanstd。dev。of7runs,10loopseach)defnormalizevectorization(df,minsalary,maxsalary):df〔NormalizedSalary〕(df〔Salary〕minsalary)(maxsalaryminsalary)returndftimeitnormalizevectorization(df,minsalary,maxsalary)1。58ms7。87sperloop(meanstd。dev。of7runs,1000loopseach)
  可以看到:
  loc比iloc快。如果你要使用iloc,那么最好使用这样df。iloc〔i,11〕的格式。Itertuples比loc更好,iterrows确差不多。Map和apply是第二种更快的选择。向量化的操作是最快的。向量化
  向量化操作需要定义一个向量化函数,该函数接受嵌套的对象序列或numpy数组作为输入,并返回单个numpy数组或numpy数组的元组。deffoo(val,minsalary,maxsalary):return(valminsalary)(maxsalaryminsalary)foovectorizednp。vectorize(foo)timeitdf〔NormalizedSalary〕foovectorized(df〔Salary〕,minsalary,maxsalary)154ms310sperloop(meanstd。dev。of7runs,10loopseach)conditionaltimeitdf〔Old〕(df〔Age〕80)140s11。8sperloop(meanstd。dev。of7runs,10000loopseach)isintimeitdf〔Old〕df〔Age〕。isin(range(80,100))17。4ms466sperloop(meanstd。dev。of7runs,100loopseach)binswithdigitizetimeitdf〔AgeBins〕np。digitize(df〔Age〕。values,bins〔0,18,36,54,72,100〕)12ms107sperloop(meanstd。dev。of7runs,100loopseach)print(df〔AgeBins〕)0315243345。。99999549999962999997399999819999991Name:AgeBins,Length:1000000,dtype:int64索引
  使用。at方法比使用。loc方法更快。timeitdf。loc〔987987,Name〕5。05s33。3nsperloop(meanstd。dev。of7runs,100000loopseach)timeitdf。at〔987987,Name〕2。39s23。3nsperloop(meanstd。dev。of7runs,100000loopseach)Swifter
  Swifter是一个Python包,它可以比常规的apply方法更有效地将任何函数应用到DF。!pipinstallswifterimportswifterapplytimeitdf〔NormalizedSalary〕df〔Salary〕。apply(lambdax:(xminsalary)(maxsalaryminsalary))192ms9。08msperloop(meanstd。dev。of7runs,1loopeach)swifter。applytimeitdf〔NormalizedSalary〕df〔Salary〕。swifter。apply(lambdax:(xminsalary)(maxsalaryminsalary))83。5ms478sperloop(meanstd。dev。of7runs,10loopseach)总结
  如果可以使用向量化,那么任何操作都应该优先使用它。对于迭代操作可以优先使用itertuples、apply或map等方法。还有一些单独的Python包,如dask、vaex、koalas等,它们都是构建在pandas之上或承担类似的功能,也可以进行尝试。
  作者:OkanYenign
投诉 评论 转载

梦幻西游口袋版珍兽元可以换广目巡守,稀有宝宝市场大洗牌?大家好,我是如风,资深老玩家给你带来关于梦幻的故事!(原创码字、抵制抄袭,感谢关注点赞)康少连出160极品女衣服战大佬康少,非常喜欢鉴定150级和160级武器装备。……拜托!专一才是件很酷的事情最近经常能刷到一些自以为经常换对象很酷的视频,一边假惺惺地哭诉着委屈,一边又炫耀着自己所谓的战绩。听着最近很火的一个句话真诚是必杀技,很讽刺,经常换对象的人还会对人真诚吗?你对……Pandas处理大数据的性能优化技巧Pandas是Python中最著名的数据分析工具。在处理数据集时,每个人都会使用到它。但是随着数据大小的增加,执行某些操作的某些方法会比其他方法花费更长的时间。所以了解和使用更……地球人能不能找到外星人话题大发明家地球人能不能找到外星人首先,外星生命一定存在,这个不容怀疑。宇宙不可能只创造出地球生命。(网络图片)我们知道地球生命是以碳基结构存在,但宇宙不只有……怕冷,遇冷关节疼痛?一碗温通汤,通血通脉通全身现在天气越来越冷了,你或者你的家人有没有关节不舒服甚至疼痛的表现?经常感觉手脚冰凉、大腿外侧凉、怕冷,还伴有腿疼、胳膊疼、肩颈疼痛,身体局部麻木等,阴雨降温天气更加严重,……美国拼命加息是给通胀降温,还是给美元打气?2022年,美国拼命加息,从年初的00。25,己加到33。25;3次加息0。75。美联储官员扬言,到12月利率将达到4,并在2023年之前保持在这一高位水平。这一事件负面消息更……手机电量剩一半就充好,还是快没电了再充电好?原理是什么?现在的生活不能没有手机,但是现在的手机用电也忒快了!打个游戏一转眼一半的电就没了,正准备发条朋友圈,手机没电了。我们的生活离不开手机好在现在满大街都是充电宝自……德国称从俄罗斯吸取经验,暗示对华经济脱钩据俄罗斯卫星通讯社报道,德国外长安娜莱娜贝尔伯克表示,德国将在考虑到对俄罗斯的经验并注意到所有风险的情况下与中国发展经济关系。德国跟中国一直保持着密切的经济关系,贝尔伯格……读书感想百年孤独多年以后,面对书架上略微泛黄的《百年孤独》,我将会回想起第一次读完这本书的那个遥远的午后。在2022年即将结束的日子里,我花了三四天的时间,一口气读完了这本久仰之作。曾经……肾炎患者不能吃哪些肉类?肾炎患者不建议吃的肉类食物包括:脂肪含量高的肉类,蛋白含量高的肉类,海鲜类,属于发物的肉类,腌制过以及重口味肉类。1。油腻的肉类,比如猪肥肉,鸭肉的皮。2。高蛋白的……陈子荷奥运决赛不敌邓亚萍,退出国家队后远赴德国,如今已回国说到邓亚萍,相信很多人都不陌生,作为中国女乒的首位大魔王,她的职业生涯有着非常强悍的统治力。其连续八年排名世界第一的成绩至今依然无人撼动,堪称乒坛传奇。然而,乒乓球作为一……四方伟业累亏5012万研发人员锐减35应收账款1。48亿占总长江商报消息长江商报记者蔡嘉大数据软件公司成都四方伟业软件股份有限公司(以下简称四方伟业)正式冲刺科创板IPO。招股书披露,此次四方伟业拟募资7。18亿元,分别投入……
一条针织裙让你的秋天优雅动人大便前头干硬,后边软粘,意味着什么?医生解密,又涨知识了我在西藏自驾旅行的19天做一个刚刚好的姑娘中国VS中国香港省队全主力出征,国足锋线轮换成关键制胜点蚂蚁腾讯百度京东等联合发起数字藏品行业自律发展倡议福建13位企业家获评20212022年度全国优秀企业家逃离魔法监狱非线性解密游戏随便境现已发售我的星愿华为余承东把高端机市场让给苹果,把低端机让给小米全国乒乓球锦标赛黄石开拍爱特斯拉胜过孩子?特斯拉自动驾驶撞飞假人,粉丝反驳用亲女儿测热血传奇一些玩家为什么说1。76版本后无传奇?读书修行满分文章每日一读中国女性结扎后是否会男性化女人结扎后会有哪些变化什么八字的女孩人见人爱订婚宴新人父母祝酒词圣诞套装你就是六年级我的自传范文北极霞水母海底世界中最大的水母六年级课文月光曲教案设计天使之泪(天使之泪,巴松措湖)澜湄合作机制的挑战与对策量血压,不同测量方式也有差异?一起来看看测血压的小细节

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利