最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Pandas字符串操作的各種方法及速度測試

 更新時間:2023年08月23日 15:13:24   作者:Dr.?Mandar?Karhade  
這篇文章主要為大家介紹了Pandas字符串操作的各種方法及速度測試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

由于LLM的發(fā)展, 很多的數(shù)據(jù)集都是以DF的形式發(fā)布的,所以通過Pandas操作字符串的要求變得越來越高了,所以本文將對字符串操作方法進行基準測試,看看它們是如何影響pandas的性能的。因為一旦Pandas在處理數(shù)據(jù)時超過一定限制,它們的行為就會很奇怪。

我們用Faker創(chuàng)建了一個100,000行的測試數(shù)據(jù)。

測試方法

安裝:

!pip install faker

生成測試數(shù)據(jù)的方法很簡答:

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')

創(chuàng)建了非常簡單的函數(shù)來測試連接兩個字符串的各種方法。

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

創(chuàng)建一個空DF,編寫一個函數(shù)將輸出%%timeit作為一行添加到數(shù)據(jù)框中

# 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

然后就是運行上面的每個函數(shù)并將數(shù)據(jù)導出到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)>

完整的函數(shù)調(diào)用

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

試驗

上面是代碼,下面開始用上面的代碼進行試驗:

Iterrows (pandas原生函數(shù))每行相加

%%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原生函數(shù)作為字符串相加

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

使用原生函數(shù)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數(shù)組矢量化

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

顯式在numpy數(shù)組上使用numpy向量化

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

優(yōu)化后的列表推導式

%%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種不同函數(shù)測試了結果。

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

從1000行擴展到100,000行所需的時間;

可視化對比:

所有矢量化方法都非???,而且pandas標準的str.add對numpy數(shù)組也進行了矢量化。能夠看到Pandas的原生方法一般都是線性的。List-map似乎以N的平方根的速度增長

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

使用fstring,結果很有趣,有的結果無法解釋。

時間

可視化

從時間上看,長度超過10,000的DF時,向量化是正確執(zhí)行的

下圖是第三個函數(shù),就是*100,這更能說明問題,向量化操作的基本上時間沒有變化

總結

通過上面的測試,我們可以總結一下結果:

1、還是老生常談的問題,不要使用iterrows(), itertuples(),盡量不要使用DataFrame.apply(),因為幾個函數(shù)還是循環(huán)遍歷的。

2、矢量化操作在字符串操作中也是可以使用的,但是為了安全起見,使用Numpy數(shù)組。

3、列表推導式就像它的名字一樣,它還是一個list

4、還有一些奇怪的無法解釋的問題,但是大部分的情況都是可以解釋的

以上就是Pandas字符串操作的各種方法及速度測試的詳細內(nèi)容,更多關于Pandas字符串操作的資料請關注腳本之家其它相關文章!

相關文章

  • Python3讀取zip文件信息的方法

    Python3讀取zip文件信息的方法

    這篇文章主要介紹了Python3讀取zip文件信息的方法,涉及Python3 使用zipfile模塊操作zip文件的相關技巧,需要的朋友可以參考下
    2015-05-05
  • python中的tcp示例詳解

    python中的tcp示例詳解

    這篇文章主要給大家介紹了關于python中tcp協(xié)議的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • Python面向?qū)ο缶幊讨惖睦^承

    Python面向?qū)ο缶幊讨惖睦^承

    這篇文章主要介紹了Python面向?qū)ο缶幊讨惖睦^承,繼承Inheritance是指代碼復用的高級抽象,繼承是面向?qū)ο笤O計的精髓之一,實現(xiàn)了以類為單位的高級抽象級別代碼復用,下面進入文章看該內(nèi)容的下詳情
    2021-11-11
  • Python調(diào)用系統(tǒng)底層API播放wav文件的方法

    Python調(diào)用系統(tǒng)底層API播放wav文件的方法

    這篇文章主要介紹了Python調(diào)用系統(tǒng)底層API播放wav文件的方法,涉及Python使用pywin32調(diào)用系統(tǒng)底層API讀取與播放wav文件的相關操作技巧,需要的朋友可以參考下
    2017-08-08
  • Python Matplotlib繪制多子圖詳解

    Python Matplotlib繪制多子圖詳解

    Matplotlib是Python中最受歡迎的數(shù)據(jù)可視化軟件包之一,它是 Python常用的2D繪圖庫,同時它也提供了一部分3D繪圖接口。本文將詳細介紹如何通過Matplotlib繪制多子圖,以及合并圖例和調(diào)整子圖間距,需要的可以參考一下
    2022-02-02
  • Python實現(xiàn)自動化批量調(diào)整Word樣式

    Python實現(xiàn)自動化批量調(diào)整Word樣式

    在日常工作中,處理大量的Word文檔是一個常見的任務,尤其是需要批量修改文檔的樣式時,本文為大家介紹了如何使用Python實現(xiàn)自動化批量調(diào)整Word樣式,需要的可以參考下
    2024-12-12
  • 使用numpy.eye創(chuàng)建one-hot編碼的實現(xiàn)

    使用numpy.eye創(chuàng)建one-hot編碼的實現(xiàn)

    本文主要介紹了使用numpy.eye創(chuàng)建one-hot編碼的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • python實戰(zhàn)之百度智能云使人像動漫化

    python實戰(zhàn)之百度智能云使人像動漫化

    這篇文章主要介紹了python實戰(zhàn)之百度智能云使人像動漫化,文中有非常詳細的代碼示例,對正在學習python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-04-04
  • Python capitalize()函數(shù)的用法詳解

    Python capitalize()函數(shù)的用法詳解

    在Python中,capitalize()將字符串的第一個字符轉換為大寫字母,并將所有其他字符(如果有的話)轉換為小寫,本文就將給大家介紹一下Python capitalize()函數(shù)的使用方法,感興趣的朋友跟著小編一起來看看吧
    2023-07-07
  • Python機器學習NLP自然語言處理基本操作關鍵詞

    Python機器學習NLP自然語言處理基本操作關鍵詞

    本文是Python機器學習NLP自然語言處理系列文章,帶大家開啟一段學習自然語言處理 (NLP) 的旅程. 本文主要學習NLP自然語言處理關鍵詞的操作
    2021-09-09

最新評論

阿勒泰市| 临夏县| 江达县| 怀宁县| 彭阳县| 江口县| 南宁市| 昌吉市| 吉木萨尔县| 婺源县| 高密市| 宁都县| 沙河市| 固原市| 孟州市| 密山市| 台中市| 开江县| 句容市| 柞水县| 盐亭县| 白城市| 永清县| 利川市| 翁牛特旗| 黄陵县| 新乡县| 阿克| 天全县| 孝义市| 正阳县| 贺兰县| 双流县| 葵青区| 繁峙县| 遂川县| 疏勒县| 霍州市| 汝阳县| 龙川县| 江川县|