我使用pandas写出一个csv,并应用bzip2压缩,如下所示:
df.to_csv('/home/user/file.bz2', index=False, mode=writemode, header=header)
根据documentation,to_csv
从文件名中推断出需要使用bzip2
方法进行压缩。
这可确保我的~100MB CSV变为~23MB。
但是,如果我解压bz2
文件,并在我Mac上通过bzip2
运行生成的csv文件:
bzip2 /home/user/file
我得到了一个~7MB的文件!如果我在Debian上运行bzip2
,也会得到同样的结果。
造成这种差异的原因是什么?
发布于 2020-05-24 03:45:43
事实证明,这不是由过时的熊猫造成的,而是由我这边的错误预期造成的。
我实际上是通过在一天的过程中(准确地说是每分钟)附加到csv来创建数据集的,如下所示:
if first_data_of_the_day:
df.to_csv('/home/user/file.bz2', index=False, mode='w', header=True)
else:
df.to_csv('/home/user/file.bz2', index=False, mode='a', header=False)
这会产生更大的~23MB文件。
如果我全天将数据帧存储在内存中(或csv中),并且在结束时只写出一次压缩文件,我得到的是更小的~7MB文件,而不管pandas的版本如何。
发布于 2020-05-23 00:43:03
我不确定在您的情况下是否发生了这种情况,但是bzip2确实支持在速度和大小之间进行折衷的不同压缩级别,并且通过pandas
选择的压缩级别可能与CLI工具的默认级别不同。使用bz2
库:
In [118]: df = pd.DataFrame(np.random.randint(0, 100, [100000,5]))
In [119]: len(df.to_csv(None))
Out[119]: 2138880
In [120]: len(bz2.compress(df.to_csv(None).encode('ascii'), compresslevel=1))
Out[120]: 702709
In [121]: len(bz2.compress(df.to_csv(None).encode('ascii'), compresslevel=9))
Out[121]: 730415
这个有点奇怪,因为压缩9通常被认为更慢但更小,但它是我在这里生成的一个非常简单的数据集,所以它可能只是一个有点退化的情况。
https://stackoverflow.com/questions/61959018
复制相似问题