apply筛选 pandas_更快的pandas.apply搜索方法
python3中的字典类型用了哈希排列,速度很快。到底有多快呢。最近写数据分析代码,有一个筛选程序,在使用pandas.apply的过程中,在apply过程中使用了loc函数,速度很慢。为了提高速度,尝试用python的基础字典类型来改进。结果速度提高了60多倍。下面介绍过程。任务是这样:有一个目标数据集Dataframe——df1。形状为(100000,2),包括GridPower实时功率、风速
python3中的字典类型用了哈希排列,速度很快。到底有多快呢。
最近写数据分析代码,有一个筛选程序,在使用pandas.apply的过程中,在apply过程中使用了loc函数,速度很慢。为了提高速度,尝试用python的基础字典类型来改进。结果速度提高了60多倍。下面介绍过程。
任务是这样:
有一个目标数据集Dataframe——df1。形状为(100000,2),包括GridPower实时功率、风速两列数据:数据集
有一组筛选条件s1,名称为MeanPower(平均功率),索引为风速,长度为3701:筛选条件
我们的搜索目标:筛选出同一风速下,实时功率小于平均功率的数据。
解决问题的思路:
1. 在数据集df1中增加一列MeanPower,填充该风速下的平均功率。
2. 比较MeanPower列与GridPower的大小,得到结果。(略)
难题在第一步,如何根据风速和s1之间的关系填充df1呢?
我在这里用到了pandas的apply函数。
方法一,使用apply函数,并在apply中使用s1.loc来获取风速对应的平均功率:
df2 = df1
df2['MeanPower'] = df1['WindSpeed_str'].apply(lambda x: s1.loc[x])
df2方法一筛选后的结果
方法二,使用apply函数,将s1转化为python字典dict1,并在apply中使用dict1.get来获取风速对应的平均功率:
df2 = df1
dict1 = s1.to_dict()
df2['MeanPower'] = df1['WindSpeed_str'].apply(lambda x: dict1.get(x))
df2方法二筛选后的结果
很明显,两种方法得到的结果是一样的。
但是两者的计算速度呢?我们用%timeit看一下:
%timeit df2.loc[:,'MeanPower'] = df1['WindSpeed_str'].apply(lambda x: s1.loc[x])
df2使用pandas自带的loc,程序运行时间为1.55 s ± 47.5 ms
使用python字典,程序运行时间为19.8 ms ± 745 µs
可以看到,使用pandas自带的loc,程序运行时间为1.55 s ± 47.5 ms。而使用python字典,程序运行时间为19.8 ms ± 745 µs。78倍!
二者相差78倍,当数据量更大时,差距会变得更大。
所以在使用apply函数的时候,可以优先考虑python字典的方式做筛选器,而不是用pandas自带的loc。
这里并不是说loc不好,而是用python字典更适合。
更多推荐
所有评论(0)