當前位置: 妍妍網 > 碼農

別說你會用Pandas

2024-05-19碼農

說到Python處理大數據集,可能會第一時間想到Numpy或者Pandas。

這兩個庫使用場景有些不同,Numpy擅長於數值計算,因為它基於陣列來運算的,陣列在記憶體中的布局非常緊湊,所以計算能力強。但Numpy不適合做數據處理和探索,缺少一些現成的數據處理常式。

而Pandas的特點就是很適合做數據處理,比如讀寫、轉換、連線、去重、分組聚合、時間序列、視覺化等等,但Pandas的特點是效率略低,不擅長數值計算。

你可以同時使用Pandas和Numpy分工協作,做數據處理時用Pandas,涉及到運算時用Numpy,它們的數據格式互轉也很方便。

目前前言,最多人使用的Python數據處理庫仍然是pandas,這裏重點說說它讀取大數據的一般方式。

Pandas讀取大數據集可以采用chunking分塊讀取的方式,用多少讀取多少,不會太占用記憶體。

import pandas as pd
# 設定分塊大小,例如每次讀取 10000 行
chunksize = 10000
# 使用 chunksize 參數分塊讀取 CSV 檔
for chunk in pd.read_csv('large_file.csv', chunksize=chunksize):
# 在這裏處理每個 chunk,例如打印每行的資訊
print(chunk.head()) # 或者其他你需要的操作
# 如果你需要保存或進一步處理每個 chunk 的數據,可以在這裏進行
# 例如,你可以將每個 chunk 寫入不同的檔,或者對 chunk 進行某種計算並保存結果

但使用分塊讀取時也要註意,不要在迴圈內部進行大量計算或記憶體密集型的操作,否則可能會消耗過多的記憶體或降低效能。

其次你可以考慮使用用Pandas讀取資料庫(如PostgreSQL、SQLite等)或外部儲存(如HDFS、Parquet等),這會大大降低記憶體的壓力。

盡管如此,Pandas讀取大數據集能力也是有限的,取決於硬體的效能和記憶體大小,你可以嘗試使用 PySpark ,它是Spark的python api介面。

PySpark提供了類似Pandas DataFrame的數據格式,你可以 使用toPandas() 的方法,將 PySpark DataFrame 轉換為 pandas DataFrame,但需要註意的是,這可能會將所有數據載入到單個節點的記憶體中,因此對於非常大的數據集可能不可行)。

相反,你也可以使用 createDataFrame() 方法從 pandas DataFrame 建立一個 PySpark DataFrame。

PySpark處理大數據的好處是它是一個分布式電腦系統,可以將數據和計算分布到多個節點上,能突破你的單機記憶體限制。

其次,PySpark采用懶執行方式,需要結果時才執行計算,其他時候不執行,這樣會大大提升大數據處理的效率。

from pyspark.sql import SparkSession
# 建立一個 SparkSession 物件
spark = SparkSession.builder \
.appName("Big Data Processing with PySpark") \
.getOrCreate()
# 讀取 CSV 檔
# 假設 CSV 檔名為 data.csv,並且有一個名為 'header' 的表頭
# 你需要根據你的 CSV 檔的實際情況修改這些參數
df = spark.read.csv("path_to_your_csv_file/data.csv", header=True, inferSchema=True)
# 顯示數據集的前幾行
df.show(5)
# 對數據進行一些轉換
# 例如,我們可以選擇某些列,並對它們套用一些函式
# 假設我們有一個名為 'salary' 的列,並且我們想要增加它的值(僅作為範例)
df_transformed = df.withColumn("salary_increased", df["salary"] * 1.1)
# 顯示轉換後的數據集的前幾行
df_transformed.show(5)
# 將結果保存到新的 CSV 檔中
# 註意:Spark 預設不會保存表頭到 CSV,你可能需要手動處理這個問題
df_transformed.write.csv("path_to_save_transformed_csv/transformed_data", header=True)
# 停止 SparkSession
spark.stop()





如果你不會使用PySpark,可以考慮Pandas的拓展庫,比如 modin、dask、polars 等,它們提供了類似pandas的數據型別和函式介面,但使用多行程、分布式等方式來處理大數據集。

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')
# 觸發計算並顯示前幾行(註意這裏使用的是 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操作方式一樣,但又能很好的處理大數據。

所以說Pandas是完全能勝任處理大數據集的,它目前的周邊生態庫非常豐富。

加入知識星球 【我們談論數據科學】

提供100節專屬Pandas數據分析視訊教程

600+ 小夥伴一起學習!