如何压缩小于100mb的csv gzip?

时间:2018-10-11 17:49:29

标签: python python-3.x pandas compression

我有一个使用以下代码作为gzip编写的df:

df.to_csv('filepath/file.csv.gz',compression='gzip',sep=',',index=False)

以上行输出一个117mb压缩文件。如何使用to_csv中的gzip功能使文件大小更小?

编辑:

使用以下代码行来确定我正在使用多少内存:

df.info(memory_usage='deep')

知道了

memory usage: 9.9 GB

1 个答案:

答案 0 :(得分:3)

这几乎是我可以做出的回应。了解数据帧的内存消耗以及哪些dtype消耗更多的内存非常重要。我会认真推荐this page,以了解有关内存的更多信息。

假设我有一个看起来像这样的小数据框:

   Number Number2 Number3
0       1     "1"     One
1       2     "2"     Two
2       3     "3"   Three
3       4     "4"    Four

我想检查数字的dtype:

print(df.dtypes)
>>> df.dtypes
Number      int64
Number2    object
Number3    object
dtype: object

我们可以看到第2列被视为一个对象,即使该列中的所有内容只是用引号引起来的整数。在某些情况下,您可能希望将int视为字符串(例如,如果您尝试进行某种类型的字符串匹配),那么就不想将类型从object转换为int。但是在这种情况下,这没关系,您可以进行转换。让我们使用这个漂亮的小熊猫对象内存检查器检查内存使用情况:

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 serie
        usage_b = pandas_obj.memory(deep=True)
    return "{:03.2f} B".format(usage_b)
print(mem_usage(df))
### >>> mem_usage(df)
### '459.00 B'

假设我有能力将dtype从object更改为int(我们需要先删除引号):

df['Number2'] = df.Number2.str.replace('"', '')
df['Number2'] = df.Number2.astype(int)
print(df.dtypes)
### >>> df.dtypes
### Number      int64
### Number2     int32
### Number3    object
### dtype: object

print(mem_usage(df))
### >>> mem_usage(df)
### '299.00 B'
df.to_csv('./Desktop/numbers_fixed.csv', index=False)

如此,通过更改dtype,我们从459B内存更改为299B。考虑一下这是否是一个大型数据集,仅通过更改dtype就可以减少1.5倍的内存。我并不是说要任意执行此操作,但是如果您正在处理外部数据,或者只是错误地解析了df,则可能会发生这种情况。整数或浮点数可以作为对象读取,仅通过更改数据类型,您将看到大量的内存减少。只是为了说明这会继续进行文件创建,请参见图片:

Memory Reduction