Python 熊猫数据帧和csv文件之间的内存不匹配
我正在处理一个类似以下博客的大型excel文件 这篇文章是关于将对象类型列转换为类别类型的。这减少了数据帧的内存使用 我正在处理一个88MB的excel文件。在遵循代码中提到的步骤之后,我能够将df的大小减少到28MB。 问题是当我将其写入csv文件时,文件大小为193MB,比原始csv文件大 问题:是什么导致内存不匹配以及如何克服? 提前谢谢Python 熊猫数据帧和csv文件之间的内存不匹配,python,pandas,dataframe,Python,Pandas,Dataframe,我正在处理一个类似以下博客的大型excel文件 这篇文章是关于将对象类型列转换为类别类型的。这减少了数据帧的内存使用 我正在处理一个88MB的excel文件。在遵循代码中提到的步骤之后,我能够将df的大小减少到28MB。 问题是当我将其写入csv文件时,文件大小为193MB,比原始csv文件大 问题:是什么导致内存不匹配以及如何克服? 提前谢谢 import pandas as pd df=pd.read_excel('games_log.csv') df.info(memory_usage=
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)
将熊猫作为pd导入
df=pd.read\u excel('games\u log.csv')
df.info(内存使用率='deep')
def内存使用(熊猫对象):
如果存在(对象、局部数据帧):
用法\u b=pandas\u obj.memory\u用法(deep=True).sum()
否则:#我们假设如果不是df,它就是一个系列
用法=对象内存用法(deep=True)
用法\u mb=用法\u b/1024**2#将字节转换为兆字节
返回“{:03.2f}MB”。格式(用法)
#此部分将对象类型的列转换为类别类型
已转换的_obj=pd.DataFrame()
对于df.列中的列:
num\u unique\u values=len(df[col].unique())
num_total_values=len(df[col])
如果num_unique_值/num_total_值<0.5:
已转换的对象loc[:,col]=df[col].astype('category')
其他:
转换后的对象位置[:,列]=df[col]
打印(内存使用(转换对象))
打印(内存使用(df))
已将对象转换为csv('compressed\u file.csv',index=False)
最后一行将数据帧写入csv,但文件大小很大
如果num\u unique\u values/num\u total\u values<0.5:
,则所有列均为True
game_logs.csv=132.901MB
df=pd.read\u csv('game\u logs.csv',dtype='category')
df.info()
范围索引:171907个条目,0到171906
列:161个条目,获取日期信息
数据类型:类别(161)
内存使用率:52.8 MB
df.to_csv('game_logs_new.csv',index=False)
游戏日志\u new.csv=133.069MB
数据帧添加了数据。
DataFrame
转换来减小文件的实际大小,而这是不会发生的(除非您删除了大量数据)dtype
存储在内存中的方式不同;有些比其他更有效,但当您将其保存回csv
,您仍然只是存储了一堆文本csv
中不维护DataFrame
中的dtype
什么是
'games\u log.csv'
你能给出一个复制行为的例子吗?games\u log.csv是项目中使用的一个文件。这里很难用样本数据重现,因为问题是处理大量数据。
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