Сохранить большой фрейм данных pandas в Excel

#python #pandas #export-to-excel

#python #pandas #экспорт в Excel

Вопрос:

Я создаю большой фрейм данных (1,5 ГБ при сохранении в формате CSV), и мне нужно сохранить его в виде листа файла Excel вместе со вторым (намного меньшим) фреймом данных, который сохраняется на отдельном листе.

 print('Reading temporaty files for variable {}:'.format(Var))
print(' Reading stations')
s=pd.read_csv(StatFile,sep=':',dtype={'ID': 'str'},encoding='utf-8')
print(' Reading data')
d=pd.read_csv(DataFile,sep=':',dtype='str',encoding='utf-8').transpose()
d.columns = d.iloc[0]
d=d[1:].astype('float')
d.reindex_axis(sorted(d.columns), axis=1)
print('Writing out Excel file for variable {}'.format(Var))
writer = pd.ExcelWriter(Path   Var   '.xlsx', engine='xlsxwriter')
d.to_excel(writer, sheet_name='Data')
OutStatCol=['ID','Name','Longitude','Latitude','GRS','OriginalVariable','VariableUnits','URL','JsonNode']
s.to_excel(writer, columns=OutStatCol, index=False, sheet_name='Stations')
writer.save()
  

Мой код отлично работает для фреймов данных меньшего размера, но с большими я получаю следующую ошибку:

 Traceback (most recent call last):
  File "./Test2.py", line 29, in <module>
    writer.save()
  File "/home/user/miniconda2/lib/python2.7/site-packages/pandas/io/excel.py", line 1413, in save
    return self.book.close()
  File "/home/user/miniconda2/lib/python2.7/site-packages/xlsxwriter/workbook.py", line 297, in close
    self._store_workbook()
  File "/home/user/miniconda2/lib/python2.7/site-packages/xlsxwriter/workbook.py", line 624, in _store_workbook
    xlsx_file.write(os_filename, xml_filename)
  File "/home/user/miniconda2/lib/python2.7/zipfile.py", line 1148, in write
    self._writecheck(zinfo)
  File "/home/user/miniconda2/lib/python2.7/zipfile.py", line 1114, in _writecheck
    " would require ZIP64 extensions")
zipfile.LargeZipFile: Filesize would require ZIP64 extensions
  

Могу ли я каким-либо образом указать что-то вроде allowZip64=True в объявлении ExcelWriter или в методе to_excel()?

Спасибо!

Комментарии:

1. Вы пробовали разделить его пополам?

2. Мне нужен весь фрейм данных, хранящийся на одном листе, и, если я правильно понимаю, что вы предлагаете, разделение его пополам, похоже, не достигает моей цели…

3. почти готово … это ключевое слово, которое вам нужно в pd.ExcelWriter(...)

4. Я пробовал оба allowZip64=True как опцию и .use_zip64() как атрибут … оба вернули ошибки

5. @user6357781 нашел это, йо .. скажи мне, работает ли это

Ответ №1:

Для этого потребовалось немного покопаться в исходном коде, но…

 print('Reading temporaty files for variable {}:'.format(Var))
print(' Reading stations')
s=pd.read_csv(StatFile,sep=':',dtype={'ID': 'str'},encoding='utf-8')
print(' Reading data')
d=pd.read_csv(DataFile,sep=':',dtype='str',encoding='utf-8').transpose()
d.columns = d.iloc[0]
d=d[1:].astype('float')
d.reindex_axis(sorted(d.columns), axis=1)
print('Writing out Excel file for variable {}'.format(Var))
writer = pd.ExcelWriter(Path   Var   '.xlsx', engine='xlsxwriter')

#THIS
writer.book.use_zip64()

d.to_excel(writer, sheet_name='Data')
OutStatCol=['ID','Name','Longitude','Latitude','GRS','OriginalVariable','VariableUnits','URL','JsonNode']
s.to_excel(writer, columns=OutStatCol, index=False, sheet_name='Stations')
writer.save()
  

должно сработать

выяснение того, что writer не наследовалось от workbook, заняло у меня больше времени, чем должно было быть. writer.book является непосредственно экземпляром рабочей книги … d’oh

Комментарии:

1. ctl - f это ваш лучший друг при просмотре исходного кода… также notepad 🙂

2. Большое спасибо, это работает. К сожалению, после нескольких часов обработки конечный файл Excel оказался поврежден… Я запущу его снова и проверю, смогу ли я

3. У меня такая же проблема, но это решение, похоже, не работает с блоками данных. Есть идея?

4. То же самое здесь, добавьте xl_writer.book.use_zip64() но в итоге Excel поврежден.

Ответ №2:

Я только что добавил engine='xlsxwriter' в функцию .to_excel() , и это устранило проблему.