Pandas dataframe CSV уменьшает размер диска - PullRequest
2 голосов
/ 22 марта 2019

для моего университетского задания я должен создать файл 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 столбцами и 17 миллионами столбцов и размером диска 419 МБ ... совсем не улучшение ...

Можете ли вы помочь мне уменьшить размер моего CSV?Спасибо!

Ответы [ 3 ]

3 голосов
/ 22 марта 2019

В прошлом я делал аналогичное приложение: что я буду делать:

трудно сжать ваш файл, но если вашему приложению необходимо, например, расстояние между аэропортом и другими, я предлагаюЧтобы создать 9541 файл, каждый файл будет представлять собой расстояние от аэропорта до других, а его имя будет называться именем аэропорта.

, в этом случае загрузка файла действительно быстрая ...

2 голосов
/ 22 марта 2019

Заголовок вопроса ".. уменьшить размер диска" решается путем вывода сжатой версии 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 сильно сжат.

Это, конечно, не решает проблему оптимизации загрузки и экономии времени и ничего не делает для рабочей памяти.Но, надеюсь, полезно, когда дисковое пространство дороже или облачное хранилище оплачивается.

1 голос
/ 23 марта 2019

Лучшее сжатие - хранить широту и долготу каждого аэропорта, а затем вычислять расстояние между любыми двумя парами по запросу.Скажем, два 32-битных значения с плавающей запятой для каждого аэропорта и идентификатор, который будет около 110 Кбайт.Сжатый с коэффициентом около 1300.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...