微信公众号:「Python读财」
若有问题或建议,请公众号留言
Pandas是Python中用于数据处理与分析的屠龙刀,想必你们也都不陌生,但Pandas在使用上有一些技巧和须要注意的地方,尤为是对于较大的数据集而言,若是你没有适当地使用,那么可能会致使Pandas的运行速度很是慢。html
对于程序猿/媛而言,时间就是生命,这篇文章给你们总结了一些pandas常见的性能优化方法,但愿能对你有所帮助!python
读取数据是进行数据分析前的一个必经环节,pandas中也内置了许多数据读取的函数,最多见的就是用pd.read_csv()
函数从csv文件读取数据,那不一样格式的文件读取起来有什么区别呢?哪一种方式速度更快呢?咱们作个实验对比一下。数组
这里采用的数据共59万行,分别保存为xlsx
、csv
、hdf
以及pkl
格式,每种格式进行10次读取测试,获得下面的结果。性能优化
能够看到,对同一份数据,pkl
格式的数据的读取速度最快,是读取csv
格式数据的近6倍,其次是hdf
格式的数据,速度最惨不忍睹的是读取xlsx
格式的数据(这仅仅是一份只有15M左右大小的数据集呀)。微信
因此对于平常的数据集(大多为csv格式),能够先用pandas读入,而后将数据转存为pkl或者hdf格式,以后每次读取数据时候,即可以节省一些时间。代码以下:app
import pandas as pd #读取csv df = pd.read_csv('xxx.csv') #pkl格式 df.to_pickle('xxx.pkl') #格式另存 df = pd.read_pickle('xxx.pkl') #读取 #hdf格式 df.to_hdf('xxx.hdf','df') #格式另存 df = pd.read_hdf('xxx.pkl','df') #读取
在使用agg
和transform
进行操做时,尽可能使用Python的内置函数,可以提升运行效率。(数据用的仍是上面的测试用例)ide
一、agg+Python内置函数函数
二、agg+非内置函数oop
能够看到对 agg 方法,使用内置函数时运行效率提高了60%。性能
三、transform+Python内置函数
四、transform+非内置函数
对transform
方法而言,使用内置函数时运行效率提高了两倍。
假设咱们如今有这样一个电力消耗数据集,以及对应时段的电费价格,以下图所示:
数据集记录着每小时的电力消耗,如第一行表明2001年1月13日零点消耗了0.586kwh的电。不一样使用时段的电费价格不同,咱们如今的目的是求出总的电费,那么就须要将对应时段的单位电费×消耗电量。下面给出了三种写法,咱们分别测试这三种处理方式,对比一下这三种写法有什么不一样,代码效率上有什么差别。
#编写求得相应结果的函数 def get_cost(kwh, hour): if 0 <= hour < 7: rate = 0.6 elif 7 <= hour < 17: rate = 0.68 elif 17 <= hour < 24: rate = 0.75 else: raise ValueError(f'Invalid hour: {hour}') return rate * kwh #方法一:简单循环 def loop(df): cost_list = [] for i in range(len(df)): energy_used = df.iloc[i]['energy_kwh'] hour = df.iloc[i]['date_time'].hour energy_cost = get_cost(energy_used, hour) cost_list.append(energy_cost) df['cost'] = cost_list #方法二:apply方法 def apply_method(df): df['cost'] = df.apply( lambda row: get_cost( kwh=row['energy_kwh'], hour=row['date_time'].hour), axis=1) #方法三:采用isin筛选出各时段,分段处理 df.set_index('date_time', inplace=True) def isin_method(df): peak_hours = df.index.hour.isin(range(17, 24)) simple_hours = df.index.hour.isin(range(7, 17)) off_peak_hours = df.index.hour.isin(range(0, 7)) df.loc[peak_hours, 'cost'] = df.loc[peak_hours, 'energy_kwh'] * 0.75 df.loc[simple_hours,'cost'] = df.loc[simple_hours, 'energy_kwh'] * 0.68 df.loc[off_peak_hours,'cost'] = df.loc[off_peak_hours, 'energy_kwh'] * 0.6
测试结果:
能够看到,采用isin()
筛选出对应数据后分开计算的速度是简单循环的近606倍,这并非说 isin()
有多厉害,方法三速度快是由于它采用了向量化的数据处理方式(这里的isin()
是其中一种方式,还有其余方式,你们能够尝试一下) ,这才是重点。什么意思呢?
这里简单画了个图,你们能够结合这个图和代码好好体会是一个一个处理快,仍是把能进行相同操做的分开而后批量处理快。
若是在你的数据处理过程涉及到了大量的数值计算,那么使用numba
能够大大加快代码的运行效率,numba
使用起来也很简单,下面给你们演示一下。(代码处理不具备实际意义,只是展现一下效果)
首先须要安装numba
模块
>>>pip install numba
咱们用一个简单的例子测试一下numba
的提速效果
import numba @numba.vectorize def f_with_numba(x): return x * 2 def f_without_numba(x): return x * 2 #方法一:apply逐行操做 df["double_energy"] = df.energy_kwh.apply(f_without_numba) #方法二:向量化运行 df["double_energy"] = df.energy_kwh*2 #方法三:运用numba加速 #须要以numpy数组的形式传入 #不然会报错 df["double_energy"] = f_with_numba(df.energy_kwh.to_numpy())
从测试结果来看,再次凸显出向量化处理的优点,同时numba
对本来速度已经很快的向量化处理也能提升一倍多的效率。更多numba
的使用方法请参考numba的使用文档。
参考资料:
一、https://pandas.pydata.org/pan...
二、https://realpython.com/fast-f...
三、https://www.cnblogs.com/wkang...
原创不易,若是以为有点用,但愿能够随手点个赞,拜谢各位老铁。
扫码关注公众号「Python读财」,第一时间获取干货,还能够加Python学习交流群!!