熊猫数据框和CSV文件之间的内存不匹配

时间:2019-07-29 07:44:52

标签: python pandas dataframe

我正在处理类似于以下博客的大型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,但是文件大小很大。

1 个答案:

答案 0 :(得分:1)

  1. 鉴于条件if num_unique_values / num_total_values < 0.5:,所有列均为True
  2. 根据您显示的内容,所有代码都可以替换为以下内容:

新代码:

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
  1. 对于您的代码,减少了使用的内存量,但是当您保存文件时,它会更大。 在这种情况下,您应用的转换可能以某种方式将数据添加到了DataFrame
  2. 我认为您正在尝试通过DataFrame转换来减小文件的实际大小,并且这种情况不会发生(除非您删除大量数据)。
  3. 不同的dtype以不同的方式存储在内存中;有些比其他的效率更高,但是当您将其保存回csv时,您仍然只是存储一堆文本; dtype中的 DataFrame未保存在csv