让你的Pandas代码快得离谱的两个技巧 (让你的盘带出神入化)
假设你曾经经常使用过Pandas处置表格数据,你或者会相熟导入数据、荡涤和转换的环节,而后将其用作模型的输入。但是,当你须要裁减和将代码投入消费时,你的Pandas管道很或者开局解体并运转缓慢。在这篇文章中,笔者将分享2个技巧,协助你让Pandas代码快得离谱,优化数据处置效率并防止经常出现的圈套。
技巧1:矢量化操作
在Pandas中,矢量化操作是一种弱小的工具,它可以用一种更繁复和高效的方式处置整个数据框的列,而不是逐行循环。
它是如何上班的?
广播是矢量化操作的一个关键要素,它准许您直观地操作具备不同状态的对象。
eg1:具备3个元素的数组a与标量b相乘,失掉与Source状态相反的数组。
eg2:在启动加法运算时,将状态为(4,1)的数组a与状态为(3,)的数组b相加,结果会失掉一个状态为(4,3)的数组。
关于这一点曾经有很多文章,并且在深度学习中,大规模的矩阵乘法是十分经常出现的。在本文中,咱们将应用两个冗长的例子上启动讨论。
首先,假定您想要计算给定整数在列中产生的次数。以下是2种或者的方法。
"""计算DataFrameX中"column_1"列中等于指标值target的元素个数。参数:X:>defoffset_loop(X,days:int)->pd.DataFrame:d=pd.Timedelta(days=days)X["column_const"]=[x+dforxinX["column_10"]]returnXdefoffset_vectorized(X,days:int)->pd.DataFrame:X["column_const"]=X["column_10"]+pd.Timedelta(days=days)returnX
技巧2:迭代
「for循环」
第一个也是最直观的迭代方法是经常使用/target=_blankclass=infotextkey>Pythonfor循环。
defloop(df:pd.DataFrame,remove_col:str,s_to_remove_col:str)->list[str]:res=[]i_remove_col=df.columns.get_loc(remove_col)i_words_to_remove_col=df.columns.get_loc(words_to_remove_col)fori_rowinrange(df.shape[0]):res.end(remove_words(df.iat[i_row,i_remove_col],df.iat[i_row,i_words_to_remove_col]))returnresult
defapply(df:pd.DataFrame,remove_col:str,words_to_remove_col:str)->list[str]:returndf.apply(func=lambdax:remove_words(x[remove_col],x[words_to_remove_col]),axis=1).tolist()
在df.apply的每次迭代中,提供的可调用函数失掉一个Series,其索引为df.columns,其值是行的。这象征着pandas必需在每个循环中生成该序列,这是低廉的。为了降落老本,最好对您知道将经常使用的df子集调用apply,如下所示:
defapply_only_used_cols(df:pd.DataFrame,remove_col:str,words_to_remove_col:str)->list[str]:returndf[[remove_col,words_to_remove_col]].apply(func=lambdax:remove_words(x[remove_col],x[words_to_remove_col]),axis=1)
「列表组合+itertuples」
经常使用itertuples与列表相联合启动迭代必需会更好。itertuples生成带有行数据的(命名)元组。
defitertuples_only_used_cols(df:pd.DataFrame,remove_col:str,words_to_remove_col:str)->list[str]:return[remove_words(x[0],x[1])forxindf[[remove_col,words_to_remove_col]].itertuples(index=False,name=None)]
「列表组合+zip」
zip接受可迭代对象并生成元组,其中第i个元组按顺序包括一切给定可迭代对象的第i个元素。
defzip_only_used_cols(df:pd.DataFrame,remove_col:str,words_to_remove_col:str)->list[str]:return[remove_words(x,y)forx,yinzip(df[remove_col],df[words_to_remove_col])]
「列表组合+to_dict」
defto_dict_only_used_columns(df:pd.DataFrame)->list[str]:return[remove_words(row[remove_col],row[words_to_remove_col])forrowindf[[remove_col,words_to_remove_col]].to_dict(orient="records")]
「缓存」
除了咱们讨论的迭代技术之外,另外两种方法可以协助提高代码的性能:缓存和并行化。假设经常使用相反的参数屡次调用pandas函数,缓存会特意有用。例如,假设remove_words运行于具备许多重复值的数据集,您可以经常使用它functools.lru_cache来存储函数的结果并防止每次都从新计算它们。要经常使用lru_cache,只有将@lru_cache装璜器减少到的申明中remove_words,而后经常使用您首选的迭代方法将该函数运行于您的数据集。这可以显着提高代码的速度和效率。以上方的代码为例:
@lru_cachedefremove_words(...):...#Sameimplementationasbeforedefzip_only_used_cols_cached(df:pd.DataFrame,remove_col:str,words_to_remove_col:str)->list[str]:return[remove_words(x,y)forx,yinzip(df[remove_col],df[words_to_remove_col])]
减少此装璜器会生成一个函数,该函数会记住之前遇到的输入的输入,从而无需再次运转一切代码。
「并行化」
最后一张王牌是经常使用pandarallel跨多个独立的df块并行化咱们的函数调用。该工具易于经常使用:您只有导入并初始化它,而后将一切.applys更改为.parallel_applys。
frompandarallelimportpandarallelpandarallel.initialize(nb_workers=min(os.cpu_count(),12))defparapply_only_used_cols(df:pd.DataFrame,remove_col:str,words_to_remove_col:str)->list[str]:returndf[[remove_col,words_to_remove_col]].parallel_apply(lambdax:remove_words(x[remove_col],x[words_to_remove_col]),axis=1)
Python 编程,open data with Pandas,open data在那条URL链接中,详细在图里,求代码,急用
getData函数补充的部分如下(见图,注意图中源代码的缩进)
测试时要这样调用getData(),才会出结果.
### Your code
({unit:unit_x},axis=columns,inplace=True)
({unit:unit_y},axis=columns,inplace=True)
dt=(dfTemp,dfRain,how=outer,sort=True)
new_columns=[place,unit_y,max,main,value,unit_x]
dt=(columns=new_columns)
({place:},axis=columns,inplace=True)
({unit_x:unit},axis=columns,inplace=True)
({unit_y:unit},axis=columns,inplace=True)
[:, 0] = (lambda s: (()()))([:, 0])
dt=_string(index = False)
新手关于python中pandas函数的使用
利用Python的pandas数据结构来读取excel表格的数据,部分代码如下:#-*- coding:utf-8 -*-import pandas as pdimport as pltcatering_data=catering_=_excel(catering_data,index_col=u日期)#读取数据,指定日期列为索引列大多数书上都是这样写的,但是在Python2.7上运行时出现错误。 (没有在Python3.x版本试过)出现了如下问题:这里写图片描述使用help(_excel)发现参数中有必选参数sheetname,加入到函数中,代码如下:#-*- coding:utf-8 -*-import pandas as pdimport as pltcatering_data=catering_=_excel(catering_data,sheetname=0,index_col=u日期)运行成功。 sheetname=0 的意思是:读取xls文件中的第一个表格。 (假设文件中有很多个表格)另外,也可以将文件转换成csv格式,就不需要这个参数了。 代码如下:catering_data=catering_=_csv(catering_data)
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。