說到Python處理大數(shù)據(jù)集,可能會第一時間想到Numpy或者Pandas。
這兩個庫使用場景有些不同,Numpy擅長于數(shù)值計算,因為它基于數(shù)組來運算的,數(shù)組在內(nèi)存中的布局非常緊湊,所以計算能力強(qiáng)。但Numpy不適合做數(shù)據(jù)處理和探索,缺少一些現(xiàn)成的數(shù)據(jù)處理函數(shù)。
而Pandas的特點就是很適合做數(shù)據(jù)處理,比如讀寫、轉(zhuǎn)換、連接、去重、分組聚合、時間序列、可視化等等,但Pandas的特點是效率略低,不擅長數(shù)值計算。
你可以同時使用Pandas和Numpy分工協(xié)作,做數(shù)據(jù)處理時用Pandas,涉及到運算時用Numpy,它們的數(shù)據(jù)格式互轉(zhuǎn)也很方便。
目前前言,最多人使用的Python數(shù)據(jù)處理庫仍然是pandas,這里重點說說它讀取大數(shù)據(jù)的一般方式。
Pandas讀取大數(shù)據(jù)集可以采用chunking分塊讀取的方式,用多少讀取多少,不會太占用內(nèi)存。
import pandas as pd # 設(shè)置分塊大小,例如每次讀取 10000 行 chunksize = 10000 # 使用 chunksize 參數(shù)分塊讀取 CSV 文件 for chunk in pd.read_csv('large_file.csv', chunksize=chunksize): # 在這里處理每個 chunk,例如打印每行的信息 print(chunk.head()) # 或者其他你需要的操作 # 如果你需要保存或進(jìn)一步處理每個 chunk 的數(shù)據(jù),可以在這里進(jìn)行 # 例如,你可以將每個 chunk 寫入不同的文件,或者對 chunk 進(jìn)行某種計算并保存結(jié)果
但使用分塊讀取時也要注意,不要在循環(huán)內(nèi)部進(jìn)行大量計算或內(nèi)存密集型的操作,否則可能會消耗過多的內(nèi)存或降低性能。
其次你可以考慮使用用Pandas讀取數(shù)據(jù)庫(如PostgreSQL、SQLite等)或外部存儲(如HDFS、Parquet等),這會大大降低內(nèi)存的壓力。
盡管如此,Pandas讀取大數(shù)據(jù)集能力也是有限的,取決于硬件的性能和內(nèi)存大小,你可以嘗試使用PySpark,它是Spark的python api接口。
PySpark提供了類似Pandas DataFrame的數(shù)據(jù)格式,你可以使用toPandas() 的方法,將 PySpark DataFrame 轉(zhuǎn)換為 pandas DataFrame,但需要注意的是,這可能會將所有數(shù)據(jù)加載到單個節(jié)點的內(nèi)存中,因此對于非常大的數(shù)據(jù)集可能不可行)。
相反,你也可以使用 createDataFrame() 方法從 pandas DataFrame 創(chuàng)建一個 PySpark DataFrame。
PySpark處理大數(shù)據(jù)的好處是它是一個分布式計算機(jī)系統(tǒng),可以將數(shù)據(jù)和計算分布到多個節(jié)點上,能突破你的單機(jī)內(nèi)存限制。
其次,PySpark采用懶執(zhí)行方式,需要結(jié)果時才執(zhí)行計算,其他時候不執(zhí)行,這樣會大大提升大數(shù)據(jù)處理的效率。
from pyspark.sql import SparkSession # 創(chuàng)建一個 SparkSession 對象 spark = SparkSession.builder / .appName("Big Data Processing with PySpark") / .getOrCreate() # 讀取 CSV 文件 # 假設(shè) CSV 文件名為 data.csv,并且有一個名為 'header' 的表頭 # 你需要根據(jù)你的 CSV 文件的實際情況修改這些參數(shù) df = spark.read.csv("path_to_your_csv_file/data.csv", header=True, inferSchema=True) # 顯示數(shù)據(jù)集的前幾行 df.show(5) # 對數(shù)據(jù)進(jìn)行一些轉(zhuǎn)換 # 例如,我們可以選擇某些列,并對它們應(yīng)用一些函數(shù) # 假設(shè)我們有一個名為 'salary' 的列,并且我們想要增加它的值(僅作為示例) df_transformed = df.withColumn("salary_increased", df["salary"] * 1.1) # 顯示轉(zhuǎn)換后的數(shù)據(jù)集的前幾行 df_transformed.show(5) # 將結(jié)果保存到新的 CSV 文件中 # 注意:Spark 默認(rèn)不會保存表頭到 CSV,你可能需要手動處理這個問題 df_transformed.write.csv("path_to_save_transformed_csv/transformed_data", header=True) # 停止 SparkSession spark.stop()
如果你不會使用PySpark,可以考慮Pandas的拓展庫,比如modin、dask、polars等,它們提供了類似pandas的數(shù)據(jù)類型和函數(shù)接口,但使用多進(jìn)程、分布式等方式來處理大數(shù)據(jù)集。
modin庫
import modin.pandas as pd # 讀取 CSV 文件 df = pd.read_csv('path_to_your_csv_file.csv') # 顯示前幾行 print(df.head())
Dask庫
import dask.dataframe as dd # 讀取 CSV 文件 df = dd.read_csv('path_to_your_csv_file.csv') # 觸發(fā)計算并顯示前幾行(注意這里使用的是 compute 方法) print(df.head().compute())
Polars庫
import polars as pl # 讀取 CSV 文件 df = pl.read_csv('path_to_your_csv_file.csv') # 顯示前幾行print(df.head())
這幾個庫的好處是,使用成本很低,基本和pandas操作方式一樣,但又能很好的處理大數(shù)據(jù)。
所以說Pandas是完全能勝任處理大數(shù)據(jù)集的,它目前的周邊生態(tài)庫非常豐富。
本文鏈接:http://www.tebozhan.com/showinfo-26-89403-0.html說到Python處理大數(shù)據(jù)集,別說你會用Pandas
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com