代码:
废话不多说直接上代码验证这个方法。详细内容可以看后面的说明。
import pandas as pd
import psutil
def mem_usage(pandas_obj):
if isinstance(pandas_obj,pd.DataFrame):
usage_b = pandas_obj.memory_usage(deep=True).sum()
else: # 我们假设这不是一个df,而是一个 Series
usage_b = pandas_obj.memory_usage(deep=True)
usage_mb = usage_b / 1024 ** 2 # 将 bytes 转化成 megabytes
return "{:03.2f} MB".format(usage_mb)
if __name__ == '__main__':
data = pd.read_csv(r'C:\Users\Administrator\Downloads\20230428_071021.csv')
print("普通方式讀取數據大小:" + mem_usage(data))
data_with_new_read_way = pd.read_csv(r'C:\Users\Administrator\Downloads\20230428_071021.csv', dtype='category')
print("新方式讀取數據大小:" + mem_usage(data_with_new_read_way))
内存占用结果如下,可见新方法读取到的dataframe占用的内存只有默认的六分之一。
普通方式讀取數據大小:238.12 MB
新方式讀取數據大小:43.61 MB
Process finished with exit code 0
引言:
Pandas是Python中最受欢迎的数据分析和科学计算库之一。然而,当处理大型数据集时,Pandas DataFrame可能会占用大量内存,导致性能下降。本文将介绍一个解决方案,即在处理列数据类型较少的情况下,通过使用dtype
参数指定category
类型,来减小DataFrame的内存占用。
正文:
-
Pandas和DataFrame简介 Pandas是基于NumPy开发的一种数据处理工具,提供了高效、灵活且易于使用的数据结构,特别是DataFrame。DataFrame是一个二维的、带标签的数据结构,类似于电子表格或关系型数据库中的表格。然而,当处理大型数据集时,DataFrame可能会占用大量内存,成为性能瓶颈。
-
内存占用问题的原因 DataFrame的内存占用问题主要源于每列的数据类型。默认情况下,Pandas会为每列选择适当的数据类型,例如整数、浮点数或字符串。然而,某些列可能只包含有限的不同值,这意味着使用更加节省内存的数据类型可能是可行的。
-
使用
dtype
参数指定category
类型 对于列中数据类型不多的情况,我们可以通过使用dtype
参数并将其设置为category
类型来显著减小DataFrame的内存占用。category
类型是一种高度优化的数据类型,适用于具有有限不同值的列。例如,当使用
pd.read_csv
读取数据时,我们可以通过指定dtype
参数为category
类型来优化内存占用,如下所示:import pandas as pd df = pd.read_csv('data.csv', dtype={'column_name': 'category'}) #如果要指定所有的列均使用category读取的话,可以不特别指定column df = pd.read_csv('data.csv', dtype='category')
- 潜在的注意事项 尽管
category
类型可以显著减小内存占用,但它也可能带来一些潜在的注意事项。例如,由于数据存储为整数,而不是原始的对象类型,可能会导致一些数据操作的行为发生变化。此外,对于包含大量不同值的列,使用category
类型可能不会产生明显的内存优势。 -
在实际使用中,我们应该根据数据集的特征和需求来评估是否使用
category
类型,并在进行内存优化时进行测试和验证。结论:
在处理Pandas DataFrame时,特别是当面临大型数据集和内存占用问题时,通过使用dtype
参数指定category
类型可以显著减小内存占用。这种优化方法适用于列中数据类型较少的情况,可以提高性能并减少计算资源的消耗。然而,在应用该方法时,我们需要注意潜在的注意事项,并进行适当的测试和验证。
希望本文能帮助您更好地解决Pandas DataFrame在科学计算中的内存占用问题,提高数据处理效率。谢谢阅读!