Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫数据帧和csv文件之间的内存不匹配_Python_Pandas_Dataframe - Fatal编程技术网

Python 熊猫数据帧和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=

我正在处理一个类似以下博客的大型excel文件

这篇文章是关于将对象类型列转换为类别类型的。这减少了数据帧的内存使用

我正在处理一个88MB的excel文件。在遵循代码中提到的步骤之后,我能够将df的大小减少到28MB。 问题是当我将其写入csv文件时,文件大小为193MB,比原始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)
将熊猫作为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