向量化操作改進(jìn)數(shù)據(jù)分析工作流的Pandas?Numpy示例分析
導(dǎo)讀
Pandas是一種流行的用于數(shù)據(jù)操作的Python庫(kù),它提供了一種稱(chēng)為“向量化”的強(qiáng)大技術(shù)可以有效地將操作應(yīng)用于整個(gè)列或數(shù)據(jù)系列,從而消除了顯式循環(huán)的需要。在本文中,我們將探討什么是向量化,以及它如何簡(jiǎn)化數(shù)據(jù)分析任務(wù)。
什么是向量化?
向量化是將操作應(yīng)用于整個(gè)數(shù)組或數(shù)據(jù)系列的過(guò)程,而不是逐個(gè)遍歷每個(gè)元素。在Pandas中可以對(duì)整個(gè)列或Series執(zhí)行操作,而無(wú)需編寫(xiě)顯式循環(huán)。這種高效的方法利用了底層優(yōu)化的庫(kù),使您的代碼更快、更簡(jiǎn)潔。
向量化操作示例
1、基本算術(shù)運(yùn)算
一個(gè)具有兩列的DataFrame, ' a '和' B ',我們希望以元素方式添加這兩列,并將結(jié)果存儲(chǔ)在新列' C '中。通過(guò)向量化,你可以在一行代碼中實(shí)現(xiàn)這一點(diǎn):
import pandas as pd data = {'A': [1, 2, 3], 'B': [4, 5, 6]} df = pd.DataFrame(data) # Using vectorization to add columns 'A' and 'B' df['C'] = df['A'] + df['B'] print(df['C']) Output: 0 5 1 7 2 9
在本例中,加法運(yùn)算df['A'] + df['B']同時(shí)應(yīng)用于整個(gè)列'A'和'B',結(jié)果存儲(chǔ)在列'C'中。
2、apply
向量化還允許對(duì)列應(yīng)用自定義函數(shù)。假設(shè)你想計(jì)算一列中每個(gè)元素的平方:
import pandas as pd data = {'A': [1, 2, 3]} df = pd.DataFrame(data) # Define a custom function def square(x): return x ** 2 # Applying the 'square' function to the 'A' column df['A_squared'] = df['A'].apply(square) print(df['A_squared']) Output: 0 1 1 4 2 9
使用.apply()將平方函數(shù)應(yīng)用于整個(gè)'A'列。不需要顯式循環(huán)。
3、條件操作
也將矢量化用于條件操作,比如基于列a中的條件創(chuàng)建一個(gè)新的列D:
import pandas as pd data = {'A': [1, 2, 3]} df = pd.DataFrame(data) # Creating a new column 'D' based on a condition in column 'A' df['D'] = df['A'].apply(lambda x: 'Even' if x % 2 == 0 else 'Odd') print(df) Output: A D 0 1 Odd 1 2 Even 2 3 Odd
使用lambda函數(shù)來(lái)檢查' a '中的每個(gè)元素是偶數(shù)還是奇數(shù),并將結(jié)果分配給' D '列。
向量化的好處
在Pandas中向量化提供了幾個(gè)好處:
- 效率:操作針對(duì)性能進(jìn)行了優(yōu)化,并且比傳統(tǒng)的基于循環(huán)的操作快得多,特別是在大型數(shù)據(jù)集上。
- 清晰度:與顯式循環(huán)的代碼相比,代碼通常更簡(jiǎn)潔,更容易閱讀。
- 易用性:您可以使用一行代碼將操作應(yīng)用于整個(gè)行或列,降低了腳本的復(fù)雜性。
- 兼容性:Pandas與其他數(shù)據(jù)科學(xué)庫(kù)(如NumPy和scikit-learn)無(wú)縫集成,可以在數(shù)據(jù)分析和機(jī)器學(xué)習(xí)項(xiàng)目中有效地使用向量化數(shù)據(jù)。
向量化提高代碼的速度
向量化是一種強(qiáng)大的編程技術(shù),可以加快代碼的執(zhí)行速度。這種方法利用底層優(yōu)化的硬件指令和庫(kù),使計(jì)算更快、更高效。讓我們以Python和NumPy為例,探索向量化如何加快代碼的速度。
傳統(tǒng)的基于循環(huán)的處理
在許多編程場(chǎng)景中,可能需要對(duì)數(shù)據(jù)元素集合執(zhí)行相同的操作,例如逐個(gè)添加兩個(gè)數(shù)組或?qū)?shù)組的每個(gè)元素應(yīng)用數(shù)學(xué)函數(shù)。一般都會(huì)使用循環(huán)一次迭代一個(gè)元素并執(zhí)行操作。
下面是一個(gè)沒(méi)有向量化的Python示例:
list1 = [1, 2, 3, 4, 5] list2 = [6, 7, 8, 9, 10] result = [] for i in range(len(list1)): result.append(list1[i] + list2[i]) print(result) Output: [7, 9, 11, 13, 15]
雖然此代碼可以工作,但它在循環(huán)中單獨(dú)處理每個(gè)元素,這對(duì)于大型數(shù)據(jù)集來(lái)說(shuō)可能很慢。
使用NumPy進(jìn)行向量化操作
NumPy是一個(gè)流行的Python庫(kù),提供對(duì)向量化操作的支持。它利用了優(yōu)化的C和Fortran庫(kù),使其在數(shù)值計(jì)算方面比純Python循環(huán)快得多。
下面是使用NumPy的相同加法操作:
array1 = np.array([1, 2, 3, 4, 5]) array2 = np.array([6, 7, 8, 9, 10]) result = array1 + array2 print(result) Output: [ 7 9 11 13 15]
NumPy可以一次對(duì)整個(gè)數(shù)組執(zhí)行操作,并且更有效地處理底層細(xì)節(jié)。
效率比較
比較一下使用NumPy和Python中傳統(tǒng)的基于循環(huán)的方法執(zhí)行元素加法所花費(fèi)的時(shí)間。我們將使用timeit模塊來(lái)度量這兩個(gè)方法的執(zhí)行時(shí)間。下面是比較的代碼:
import numpy as np import timeit # Create two NumPy arrays and two lists for the comparison array1 = np.random.randint(1, 100, size=1000000) array2 = np.random.randint(1, 100, size=1000000) list1 = list(array1) list2 = list(array2) # Vectorized processing with NumPy def numpy_vectorized(): result = array1 + array2 # Traditional loop-based processing def loop_based(): result = [] for i in range(len(list1)): result.append(list1[i] + list2[i]) # Measure execution time for NumPy vectorized approach numpy_time = timeit.timeit(numpy_vectorized, number=100) # Measure execution time for traditional loop-based approach loop_time = timeit.timeit(loop_based, number=100) print(f"NumPy Vectorized Approach: {numpy_time:.5f} seconds") print(f"Traditional Loop-Based Approach: {loop_time:.5f} seconds") Output: NumPy Vectorized Approach: 0.30273 seconds Traditional Loop-Based Approach: 17.91837 seconds
可以看到NumPy向量化方法對(duì)于大數(shù)據(jù)集的速度要快得多,因?yàn)樗氖噶炕僮魇墙?jīng)過(guò)優(yōu)化的。
向量化加速代碼的原理
向量化為加快代碼速度提供了幾個(gè)優(yōu)勢(shì):
減少循環(huán)開(kāi)銷(xiāo):在傳統(tǒng)循環(huán)中,存在與管理循環(huán)索引和檢查循環(huán)條件相關(guān)的開(kāi)銷(xiāo)。通過(guò)向量化,可以消除這些開(kāi)銷(xiāo),因?yàn)檫@些操作應(yīng)用于整個(gè)數(shù)組。
優(yōu)化的低級(jí)指令:像NumPy這樣的庫(kù)使用優(yōu)化的低級(jí)指令(例如,現(xiàn)代cpu上的SIMD指令)來(lái)對(duì)數(shù)組執(zhí)行操作,充分利用硬件功能。這可以顯著提高速度。
并行性:一些向量化操作可以并行化,這意味著現(xiàn)代處理器可以同時(shí)執(zhí)行多個(gè)操作。這種并行性進(jìn)一步加快了計(jì)算速度。
總結(jié)
Pandas和NumPy等庫(kù)中的向量化是一種強(qiáng)大的技術(shù),可以提高Python中數(shù)據(jù)操作任務(wù)的效率??梢砸愿叨葍?yōu)化的方式對(duì)整個(gè)列或數(shù)據(jù)集合執(zhí)行操作,從而生成更快、更簡(jiǎn)潔的代碼。所以無(wú)論是在處理基本算術(shù)、自定義函數(shù)還是條件操作,利用向量化都可以極大地改進(jìn)數(shù)據(jù)分析工作流。
以上就是向量化操作改進(jìn)數(shù)據(jù)分析工作流的Pandas Numpy示例分析的詳細(xì)內(nèi)容,更多關(guān)于Pandas Numpy向量化操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Python進(jìn)行PowerPoint幻燈片背景設(shè)置
設(shè)置PowerPoint幻燈片背景不僅能夠增強(qiáng)演示文稿的視覺(jué)吸引力,還能幫助傳達(dá)特定的情感或信息,本文將介紹如何使用Python為PowerPoint幻燈片設(shè)置純色、漸變及圖片背景,有需要的可以參考下2024-11-11Python itertools.product方法代碼實(shí)例
這篇文章主要介紹了Python itertools.product方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03python suds訪(fǎng)問(wèn)webservice服務(wù)實(shí)現(xiàn)
這篇文章主要介紹了python suds訪(fǎng)問(wèn)webservice服務(wù)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Tensorflow 自帶可視化Tensorboard使用方法(附項(xiàng)目代碼)
這篇文章主要介紹了Tensorflow 自帶可視化Tensorboard使用方法(附項(xiàng)目代碼),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02新年福利來(lái)一波之Python輕松集齊五福(demo)
這篇文章主要介紹了新年福利來(lái)一波之Python輕松集齊五福的小demo,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01python操作openpyxl導(dǎo)出Excel 設(shè)置單元格格式及合并處理代碼實(shí)例
這篇文章主要介紹了python操作openpyxl導(dǎo)出Excel 設(shè)置單元格格式及合并處理代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08