说到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是完全能胜任处理大数据集的,它目前的周边生态库非常丰富。