Pandas内存管理

Pandas内存管理

在这篇文章中,我们将学习pandas的内存管理。

当我们使用pandas工作时,毫无疑问,你会一直存储大数据,以便更好地分析。在处理大数据时,我们应该更加关注我们所使用的内存。当你处理小数据集时,没有任何问题。它不会引起任何问题。但是,我们可以在较大的数据集上编程而不处理内存问题。

现在我们将看到关于如何减少错误和内存消耗。它通过加快计算速度使我们的工作更容易。

查找内存使用情况

Info() :

Info()方法返回数据框架的摘要。

语法:

DataFrame.info(verbose=None, buf=None, max_cols=None, memory_usage=None, show_counts=None, null_counts=None)

这将打印出数据框架的简短而温馨的摘要。当我们把它作为参数时,它也会给出数据框架的内存使用量。对于这个参数,我们应该把memory_usage写成 “deep”。

import pandas as pd
  
  
df = pd.read_csv(data.csv)
df.info(memory_usage="deep")

输出:

Pandas内存管理

Memory_usage():

Pandas memory_usage()函数返回索引的内存用量。它返回索引中所有单个标签所使用的内存之和。

语法:

DataFrame.memory_usage(index=True, deep=False)

然而,Info()只给出了数据所使用的总体内存。这个函数以字节为单位返回每一列的内存使用情况。它可以更有效地找到数据框架中哪一列使用更多的内存。

import pandas as pd
  
df = pd.read_csv(data.csv)
df.memory_usage()

输出:

Pandas内存管理

在Pandas中优化内存的方法

将数字列改为较小的dtype

这是一个非常简单的方法来保存程序使用的内存。Pandas默认将整数值存储为int64,将浮点值存储为float64。这实际上占用了更多的内存。相反,我们可以将数据类型下移。简单地将int64值转换为int8,将float64转换为float8。这将减少内存的使用。通过转换数据类型而不做任何妥协,我们可以直接将内存用量减少到近一半。

语法:

columnName.astype(‘float16’)

注意:你不能把每个值都存储在int16或float16下。一些较大的数字仍然需要被存储为较大的数据类型。

代码:

import pandas as pd
df = pd.read_csv('data.csv')
  
# Downcasting float64 to float16
df['price'].memory_usage()
  
df['price'] = df['price'].astype('float16')
df['price'].memory_usage()

输出:

173032
43354

停止加载整列

我们在工作中经常会遇到较大的数据集,但没有必要加载整个数据集。相反,我们可以加载你要工作的特定列。通过这样做,我们可以将消耗的内存量限制在一个非常低的数值。

要做到这一点,只需形成一个临时数据集,其中只包含你要处理的数值。

df.info(verbose = False, memory_usage = 'deep')
df = df[['price', 'sqft_living]]
df.info(verbose = False, memory_usage = 'deep')

输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 21613 entries, 0 to 21612
Columns: 22 entries, Unnamed: 0 to sqft_lot15
dtypes: float16(1), float64(5), int64(15), object(1)
memory usage: 4.8 MB
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 21613 entries, 0 to 21612
Columns: 2 entries, price to sqft_living
dtypes: float16(1), int64(1)
memory usage: 211.2 KB

在上面的例子中,我们可以清楚地看到,将特定的列加载到数据框架中可以减少内存的使用。

Deleting

删除是节省空间的方法之一。这可能是解决任何内存问题的最好办法。我们可能在不知不觉中为训练和测试保存了许多数据帧,这些数据帧在这个过程中没有被使用。我们还可以删除未使用的列。通过删除这些可以节省更多的空间。我们还可以删除数据框架中的空列,这也可以节省更多的空间。我们可以使用del关键字,后面跟着你想删除的项目。这将会删除该项目。

# importing the modules
import pandas as pd
import numpy
  
# Reading the csv file
df = pd.read_csv('data.csv')
  
# Deleting unwanted columns
del df["Unnamed: 0"]

Pandas内存管理

改变分类栏

在处理一些数据集时,我们可能会有一些分类列,其中整个列只由一组固定的值重复组成。这种类型的数据被称为分类值,基本上是分类或分组,其中一大组行有类似的分类值。在处理这些类型的数据时,我们可以简单地将每个分类值分配给一些字母或整数[基本上是编码]。这种方法可以成倍地减少程序使用的内存量。

语法:

df[‘column_name’].replace(‘largerValue’, ‘alphabet’, inplace=True) 
# importing the modules
import pandas
import numpy
  
# Reading the csv file
df = pd.read_csv('data.csv')
  
# Memory usage before replacing
df['bedrooms'].memory_usage()
# output--> 314640
  
# Replacing the categorical values
df['bedrooms'].replace('more than 2', 1, inplace=True)
df['bedrooms'].replace('less than 2', 0, inplace=True)
  
# Memory usage after replacing
df['bedrooms'].memory_usage()
# output--> 173032

输出:

314640
173032

在将列卧室的分类值替换为1和0后,你可以看到内存使用量减少了一半。

分块导入数据

在处理数据时,很明显,在某些情况下,我们需要与大数据打交道,这些数据一般都是以千兆字节计的。你的机器可能有大量的计算能力,要把这些数据一下子装进内存,几乎是不可能的。在这种情况下,pandas有一个非常方便的方法,可以分块加载数据,这基本上可以帮助我们迭代数据集并分块加载,而不是一次性加载所有的数据,把你的机器推到极限。

要做到这一点,我们需要在读取数据时传递名为chunk size的参数。这将给我们提供我们需要串联成一个完整数据集的数据块。通过这种方式,我们可以一下子减少机器的内存使用量,并给一些时间来恢复其计算能力,以处理流量。

语法 :

pandas.read_csv(‘fileName.csv’, chunksize=1000) 

该方法将返回一个数据集的可迭代对象。

# importing the mmodule
import pandas
  
# Reading the data in chunks
data = pandas.read_csv('data.csv', chunksize=1000)
  
# Concatenating the chunks together
df = pandas.concat(data)

输出:

Pandas内存管理

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程