Pandas字符串操作的各种方法及速度测试

 更新时间:2023年08月23日 15:13:24   作者:Dr. Mandar Karhade  
这篇文章主要为大家介绍了Pandas字符串操作的各种方法及速度测试,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

由于LLM的发展, 很多的数据集都是以DF的形式发布的,所以通过Pandas操作字符串的要求变得越来越高了,所以本文将对字符串操作方法进行基准测试,看看它们是如何影响pandas的性能的。因为一旦Pandas在处理数据时超过一定限制,它们的行为就会很奇怪。

我们用Faker创建了一个100,000行的测试数据。

测试方法

安装:

!pip install faker

生成测试数据的方法很简答:

import pandas as pd
 import numpy as np
 def gen_data(x):
   from faker import Faker
   fake = Faker()
   outdata = {}
   for i in range(0,x):
     outdata[i] = fake.profile()
   return pd.DataFrame(outdata).T
 n= 100000
 basedata = gen_data(n)

然后把Google Colab将输出存储在Google drive中

from google.colab import drive
 drive.mount('/content/drive')

创建了非常简单的函数来测试连接两个字符串的各种方法。

def process(a,b):
   return ''.join([a,b])
 
 def process(a,b):
   return a+b
 
 def process(a,b):
   return f"{a}{b}"
 
 def process(a,b):
   return f"{a}{b}"*100

创建一个空DF,编写一个函数将输出%%timeit作为一行添加到数据框中

# add a row to the dataframe using %%timeit output
 def add_to_df(n, m, x, outputdf):
   outputdf.loc[len(outputdf.index)] = [m, n, x]
 
 # output frame
 outputdf = pd.DataFrame(columns=['method', 'n', 'timing'])
 outputdf

然后就是运行上面的每个函数并将数据导出到pandas的代码。

# get a sample of data
 n = 10000
 suffix = 'fstring_100x'
 data = basedata.copy().sample(n).reset_index()

记录运行时间

%%timeit -r 7 -n 1 -o
 data['newcol'] = ''
 for row in range(len(data)):
   data.at[row ,'newcol'] = process(data.at[row, 'job'], data.at[row, 'company'])
 # 451 ms ± 34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
 # <TimeitResult : 451 ms ± 34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)>

完整的函数调用

m = "Iterating over the rows"
 add_to_df(n = n, m = m, x = vars(_), outputdf = outputdf)

试验

上面是代码,下面开始用上面的代码进行试验:

Iterrows (pandas原生函数)每行相加

%%timeit -r 7 -n 1 -o
 data['newcol'] = ''
 for row, item in data.iterrows():
   data.at[row ,'newcol'] = process(item['job'], item['company'])

Itertuples(由于不可变而更安全)每行相加

%%timeit -r 7 -n 1 -o
 data['newcol'] = ''
 for row, job, company in data[['job','company']].itertuples():
   data.at[row ,'newcol'] = process(job, company)

使用pandas原生函数作为字符串相加

%%timeit -r 7 -n 1 -o
 data['newcol'] = data.job + data.company

使用原生函数pandas. series .add

%%timeit -r 7 -n 1 -o
 data['newcol'] = data.job.add(data.company)

使用dataframe.apply

%%timeit -r 7 -n 1 -o
 data['newcol'] = data.apply(lambda row: process(row['job'],row['company']), axis=1)

使用List Map

%%timeit -r 7 -n 1 -o
 data['newcol'] = list(map(process, data.job, data.company))

Pandas矢量化

%%timeit -r 7 -n 1 -o
 data['newcol'] = process(data.job, data.company)

numpy数组矢量化

%%timeit -r 7 -n 1 -o
 data['newcol'] = process(data.job.to_numpy(), data.company.to_numpy())

显式在numpy数组上使用numpy向量化

%%timeit -r 7 -n 1 -o
 data['newcol'] = np.vectorize(process)(data.job.to_numpy(), data.company.to_numpy())

优化后的列表推导式

%%timeit -r 7 -n 1 -o
 data['newcol'] = ''
 data['newcol'] =[process(i,j) for i,j in list(zip(data.job, data.company)) ]

最后是结果的输出:

outputdf.to_csv(f"./drive/MyDrive/{n}_{suffix}.csv")

结果

结果如下所示。我用了上面3种不同函数测试了结果。

原生的字符串加法C = a+b

从1000行扩展到100,000行所需的时间;

可视化对比:

所有矢量化方法都非常快,而且pandas标准的str.add对numpy数组也进行了矢量化。能够看到Pandas的原生方法一般都是线性的。List-map似乎以N的平方根的速度增长

使用fstring: c = f " {a}{b} "

使用fstring,结果很有趣,有的结果无法解释。

时间

可视化

从时间上看,长度超过10,000的DF时,向量化是正确执行的

下图是第三个函数,就是*100,这更能说明问题,向量化操作的基本上时间没有变化

总结

通过上面的测试,我们可以总结一下结果:

1、还是老生常谈的问题,不要使用iterrows(), itertuples(),尽量不要使用DataFrame.apply(),因为几个函数还是循环遍历的。

2、矢量化操作在字符串操作中也是可以使用的,但是为了安全起见,使用Numpy数组。

3、列表推导式就像它的名字一样,它还是一个list

4、还有一些奇怪的无法解释的问题,但是大部分的情况都是可以解释的

以上就是Pandas字符串操作的各种方法及速度测试的详细内容,更多关于Pandas字符串操作的资料请关注脚本之家其它相关文章!

相关文章

  • Python中报错 “TypeError: ‘list‘ object is not callable”问题及解决

    Python中报错 “TypeError: ‘list‘ object is&n

    这篇文章主要介绍了Python中报错 “TypeError: ‘list‘ object is not callable”问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • python实现抠图给证件照换背景源码

    python实现抠图给证件照换背景源码

    这篇文章主要为大家详细介绍了python实现抠图给证件照换背景源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • python可迭代对象去重实例

    python可迭代对象去重实例

    这篇文章主要介绍了python可迭代对象去重实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python爬虫获取百度首页内容教学

    python爬虫获取百度首页内容教学

    在本篇内容里小编给大家分享了关于python爬虫获取百度首页内容教学,需要的朋友们可以跟着学习下。
    2018-12-12
  • Python人工智能之混合高斯模型运动目标检测详解分析

    Python人工智能之混合高斯模型运动目标检测详解分析

    运动目标检测是计算机视觉领域中的一个重要内容,其检测效果将会对目标跟踪与识别造成一定的影响,本文将介绍用Python来进行混合高斯模型运动目标检测,感兴趣的朋友快来看看吧
    2021-11-11
  • python3 http.client 网络请求方式

    python3 http.client 网络请求方式

    这篇文章主要介绍了python3 http.client 网络请求方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python实现提取XML内容并保存到Excel中的方法

    Python实现提取XML内容并保存到Excel中的方法

    这篇文章主要介绍了Python实现提取XML内容并保存到Excel中的方法,涉及Python针对xml文件的读取、解析以及Excel文件的写入、保存等相关操作技巧,需要的朋友可以参考下
    2018-09-09
  • Python中range函数的使用方法

    Python中range函数的使用方法

    这篇文章主要介绍了Python中range函数的使用方法,文章基于Python3环境展开range函数的使用方法,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • python实现一次创建多级目录的方法

    python实现一次创建多级目录的方法

    这篇文章主要介绍了python实现一次创建多级目录的方法,涉及Python中os模块makedirs方法的使用技巧,非常简单实用,需要的朋友可以参考下
    2015-05-05
  • Python表示矩阵的方法分析

    Python表示矩阵的方法分析

    这篇文章主要介绍了Python表示矩阵的方法,结合具体实例形式分析了Python表示矩阵的方法与相关操作注意事项,需要的朋友可以参考下
    2017-05-05

最新评论