熊猫数据框CSV减小磁盘大小

时间:2019-03-22 12:23:44

标签: python pandas csv dataframe compression

对于我的大学作业,我必须生成一个包含世界各个机场距离的csv文件...问题是我的csv文件重量为151Mb。我想尽可能减少它:这是我的csv:

enter image description here

这是我的代码:

# drop all features we don't need
for attribute in df:
    if attribute not in ('NAME', 'COUNTRY', 'IATA', 'LAT', 'LNG'):
        df = df.drop(attribute, axis=1)

# create a dictionary of airports, each airport has the following structure:
# IATA : (NAME, COUNTRY, LAT, LNG)
airport_dict = {}
for airport in df.itertuples():
    airport_dict[airport[3]] = (airport[1], airport[2], airport[4], airport[5])

# From tutorial 4 soulution:
airportcodes=list(airport_dict)
airportdists=pd.DataFrame()
for i, airport_code1 in enumerate(airportcodes):
    airport1 = airport_dict[airport_code1]
    dists=[]
    for j, airport_code2 in enumerate(airportcodes):
        if j > i:
            airport2 = airport_dict[airport_code2]
            dists.append(distanceBetweenAirports(airport1[2],airport1[3],airport2[2],airport2[3]))
        else:
        # little edit: no need to calculate the distance twice, all duplicates are set to 0 distance
            dists.append(0)
    airportdists[i]=dists
airportdists.columns=airportcodes
airportdists.index=airportcodes

# set all 0 distance values to NaN
airportdists = airportdists.replace(0, np.nan)
airportdists.to_csv(r'../Project Data Files-20190322/distances.csv')

在保存之前,我还尝试过重新编制索引:

# remove all NaN values
airportdists = airportdists.stack().reset_index()
airportdists.columns = ['airport1','airport2','distance']

但是结果是一个具有3列和1700万列的数据帧,磁盘大小为419Mb ...完全没有改善...

您能帮我缩小csv的大小吗?谢谢!

4 个答案:

答案 0 :(得分:3)

我过去曾经做过类似的申请:我将要做的事情:

很难缩小文件,但是如果您的应用程序需要例如在一个机场与其他机场之间保持一定距离,我建议您创建9541个文件,每个文件都将是一个机场到其他机场的距离,其名称将为是机场的名称。

在这种情况下,文件加载非常快...

答案 1 :(得分:2)

问题的标题“ ..减小磁盘大小”通过输出csv的压缩版本来解决。

airportdists.to_csv(r'../Project Data Files-20190322/distances.csv', compression='zip')

或者Pandas 0.24.0更好一点

airportdists.to_csv(r'../Project Data Files-20190322/distances.csv.zip')

您会发现csv已大大压缩。

这当然不能解决优化负载和节省时间的问题,并且对工作内存无济于事。但希望在磁盘空间不足或要为云存储付费时有用。

答案 2 :(得分:1)

最好的压缩方法是存储每个机场的纬度和经度,然后根据需要计算任意两对飞机之间的距离。假设每个机场和标识符有两个32位浮点值,大约为110K字节。压缩约1300倍。

答案 3 :(得分:1)

我的建议是,不要将其存储为CSV,而应尝试存储在像JSON这样的键值对数据结构中。检索将非常快。或者尝试使用镶木地板文件格式,该格式将占用CSV文件存储空间的1/4。

import pandas as pd
import numpy as np
from pathlib import Path
from string import ascii_letters

#created a dataframe
df = pd.DataFrame(np.random.randint(0,10000,size=(1000000, 52)),columns=list(ascii_letters))

df.to_csv('csv_store.csv',index=False)
print('CSV Consumend {} MB'.format(Path('csv_store.csv').stat().st_size*0.000001))
#CSV Consumend 255.22423999999998 MB

df.to_parquet('parquate_store',index=False)
print('Parquet Consumed {} MB'.format(Path('parquate_store').stat().st_size*0.000001))
#Parquet Consumed 93.221154 MB