pandas减少dataframe占用内存的若干方法
一、只获取文件需要的列,避免加载整个文件
举例:只获取A.B两列数据
df = pd.read_csv('123.csv', usecols=['A', 'B'])
二、使用更准确的数据类型,减少内存空间占用
import pandas as pd
import numpy as np # 假设你的CSV文件有三列,分别名为'A', 'B', 'C'
# 并且你希望列'A'为int32类型,列'B'为int64类型,列'C'为str类型
dtype_dict = { 'A': np.int32, 'B': np.int64, 'C': str
} # 使用pandas.read_csv()读取CSV文件,并指定dtype
df = pd.read_csv('your_file.csv', dtype=dtype_dict) # 查看结果
print(df.dtypes)
需要注意的是,在指定了数据类型之后,不满足的数据可能会被忽略或者由指定的数据进行替换,其中数据类型越小占用空间越少,比如int32几乎比int64少用一办的空间,但是具体采用哪种数据类型,还跟数据的范围有关系,一般来说:
int32的最大值为:2147483647(2^31 - 1)。这是32位有符号整数类型能表示的最大整数值。
- int32 范围:-2147483648到2147483647(包括边界值)。
int64的最大值为:9223372036854775807(2^63 - 1)。这是64位有符号整数类型能表示的最大整数值。
- 范围:-9223372036854775808到9223372036854775807(包括边界值)。
三、大数进行单位换算转小数据处理
如果数据中涉及汇总,单位换算的,可以提前将数据进行单位换算,比如从字节先换算为GB,那么他的数据类型可能就可以从int64转换为int32,可以节省一大部分空间,转换类型的方法如下:
import pandas as pd
import numpy as np # 假设我们有一个DataFrame df,其中一列名为'A'的数据类型是int64
df = pd.DataFrame({'A': [1, 2, 3, 2**30, -2**30]}) # 注意:这里我们包括了一个接近int32边界的值 # 检查原始数据类型
print(df.dtypes) # 将列'A'从int64转换为int32
# 注意:我们先转换为NumPy数组,然后转换数据类型,最后再转换回pandas的Series
df['A'] = df['A'].astype(np.int32) # 再次检查数据类型
print(df.dtypes)
需要注意的是,转换的前提是该列的值都应该小于int32的最大值,否则会报数值溢出错误。
四、数据原地替换避免复制
一般来说在dataframe中使用 = 赋值,copy()方法,groupby()方法,pd.concat()方法,reset_index()方法,.loc[]
、.iloc[]
和.at[]
等方法进行行或列的选择时都可能会发生数据复制导致内存占用,因此在譬如drop,rename,drop_duplicates时尽量采用inplace参数对数据进行原地赋值更新,减少由=赋值带来的赋值内存占用,比如:
df.drop(labels=['A'], inplace=True)