作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 df,我使用以下代码行将其编写为 gzip:
df.to_csv('filepath/file.csv.gz',compression='gzip',sep=',',index=False)
上面的行输出一个 117mb 的 gzip 压缩文件。如何使用 to_csv
中的 gzip 功能使文件大小更小?
编辑:
使用这行代码来确定我使用了多少内存:
df.info(memory_usage='deep')
得到了
memory usage: 9.9 GB
最佳答案
这只是我能做出的最小回应。了解数据帧的内存消耗以及哪些数据类型消耗更多内存非常重要。我会认真推荐this page了解有关内存的更多信息。
假设我有一个看起来像这样的小数据框,称为数字:
Number Number2 Number3
0 1 "1" One
1 2 "2" Two
2 3 "3" Three
3 4 "4" Four
我想检查数字的数据类型:
print(df.dtypes)
>>> df.dtypes
Number int64
Number2 object
Number3 object
dtype: object
我们可以看到第 2 列被视为一个对象,尽管该列中的所有内容都只是一个用引号括起来的整数。在某些情况下,您可能希望将 int 视为字符串(例如,如果您尝试进行某种类型的字符串匹配),那么您不希望将类型从 object 转换为 int。但在这种情况下,这并不重要,您可以进行转换。让我们使用这个漂亮的小 pandas 对象内存检查器检查内存使用情况:
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'
假设我有能力将数据类型从 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,则可能会发生这种类型的事情。整数或 float 可以作为对象读入,只需更改数据类型,您就会看到内存的巨大减少。只是为了显示这会延续到文件创建,请参见图像:
关于python - 如何将 csv gzip 压缩到小于 100mb?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52766179/
我是一名优秀的程序员,十分优秀!