我正在处理类似于以下博客的大型excel文件。
https://www.dataquest.io/blog/pandas-big-data/
该帖子是关于将对象类型列转换为类别类型的。这样可以减少数据帧的内存使用量。
我正在处理88 MB的Excel文件。在代码中提到的步骤之后,我能够将df的大小减小到28 MB。 问题是当我将其写入csv文件时,文件大小为193 MB,大于原始csv文件。
问题:什么原因导致内存不匹配以及如何解决? 预先感谢。
import pandas as pd
df=pd.read_excel('games_log.csv')
df.info(memory_usage='deep')
def mem_usage(pandas_obj):
if isinstance(pandas_obj,pd.DataFrame):
usage_b = pandas_obj.memory_usage(deep=True).sum()
else: # we assume if not a df it's a series
usage_b = pandas_obj.memory_usage(deep=True)
usage_mb = usage_b / 1024 ** 2 # convert bytes to megabytes
return "{:03.2f} MB".format(usage_mb)
#This part converts the columns of object type to category type
converted_obj = pd.DataFrame()
for col in df.columns:
num_unique_values = len(df[col].unique())
num_total_values = len(df[col])
if num_unique_values / num_total_values < 0.5:
converted_obj.loc[:,col] = df[col].astype('category')
else:
converted_obj.loc[:,col] = df[col]
print(mem_usage(converted_obj))
print(mem_usage(df))
converted_obj.to_csv('compressed_file.csv',index=False)
最后一行将数据帧写入csv,但是文件大小很大。
答案 0 :(得分:1)
if num_unique_values / num_total_values < 0.5:
,所有列均为True
game_logs.csv = 132.901MB
df = pd.read_csv('game_logs.csv', dtype='category')
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 171907 entries, 0 to 171906
Columns: 161 entries, date to acquisition_info
dtypes: category(161)
memory usage: 52.8 MB
df.to_csv('game_logs_new.csv', index=False)
game_logs_new.csv = 133.069MB
DataFrame
。 DataFrame
转换来减小文件的实际大小,并且这种情况不会发生(除非您删除大量数据)。dtype
以不同的方式存储在内存中;有些比其他的效率更高,但是当您将其保存回csv
时,您仍然只是存储一堆文本; dtype
中的 DataFrame
未保存在csv