如图所示, pandas 默认会按照数据类型分组存储. 分组存储的每个块中并不包含数据列名, 这是因为块只维护数据的实际存储值. 而由 BlockManager 类来维护列和索引与实际块之间的映射.

pandas 每个数据类型类都在 pandas.core.internals 中. 对于字符串和混合类型, 使用 ObjectBlock. 对于 float 会使用 FloatBlock. 针对 int 和 float 的列, pandas 会将其存储为 Numpy ndarray.

字符串在 pandas 中的内存组织

在pandas 中, 默认存储 string 的 object 类型 (使用可变数量的内存) 和 python 对 string 的存储方式是一致的.

因为Python是一种高级解释语言,所以它没有对内存中的值的存储方式进行细粒度控制。

此限制导致字符串以碎片方式存储,消耗更多内存并且访问速度较慢。对象列中的每个元素实际上都是一个指针,其中包含实际值在内存中的位置的“地址”。

下面的图表显示了数字数据如何存储在NumPy数据类型中,以及如何使用Python的内置类型存储字符串

查看 dataframe 整体使用内存

dataframe.info(memory_usage='deep')

查看 datafraem 中每种数据类型的平均使用内存

for dtype in ['float','int','object']:
	selected_dtype = gl.select_dtypes(include=[dtype])
	mean_usage_b = selected_dtype.memory_usage(deep=True).mean()
	mean_usage_mb = mean_usage_b / 1024 ** 2
	print("Average memory usage for {} columns: {:03.2f} MB".format(dtype,mean_usage_mb))

限制数据的宽度可以减少数据使用内存