2017-02-21 11 views
10

Я хочу использовать файлы excel для хранения данных, разработанных с помощью python. Моя проблема в том, что я не могу добавить листы в существующий файл excel. Здесь я предлагаю пример кода для работы с тем чтобы достичь этому вопросуКак сохранить новый лист в существующем файле Excel, используя Pandas?

import pandas as pd 
import numpy as np 

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx" 

x1 = np.random.randn(100, 2) 
df1 = pd.DataFrame(x1) 

x2 = np.random.randn(100, 2) 
df2 = pd.DataFrame(x2) 

writer = pd.ExcelWriter(path, engine = 'xlsxwriter') 
df1.to_excel(writer, sheet_name = 'x1') 
df2.to_excel(writer, sheet_name = 'x2') 
writer.save() 
writer.close() 

Этот код сохраняет две DataFrames до двух листов, названный «x1» и «x2» соответственно. Если я создаю два новых DataFrames и попытаюсь использовать один и тот же код для добавления двух новых листов, «x3» и «x4», исходные данные будут потеряны.

import pandas as pd 
import numpy as np 

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx" 

x3 = np.random.randn(100, 2) 
df3 = pd.DataFrame(x3) 

x4 = np.random.randn(100, 2) 
df4 = pd.DataFrame(x4) 

writer = pd.ExcelWriter(path, engine = 'xlsxwriter') 
df3.to_excel(writer, sheet_name = 'x3') 
df4.to_excel(writer, sheet_name = 'x4') 
writer.save() 
writer.close() 

Я хочу, чтобы первенствовать файл с четырьмя листами: 'x1', 'x2', 'x3', 'x4'. Я знаю, что «xlsxwriter» - не единственный «движок», есть «openpyxl». Я также видел, что уже есть другие люди, которые писали об этой проблеме, но все же я не могу понять, как это сделать.

Вот код, взятый из этого link

import pandas 
from openpyxl import load_workbook 

book = load_workbook('Masterfile.xlsx') 
writer = pandas.ExcelWriter('Masterfile.xlsx', engine='openpyxl') 
writer.book = book 
writer.sheets = dict((ws.title, ws) for ws in book.worksheets) 

data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2']) 

writer.save() 

Они говорят, что это работает, но это трудно понять, каким образом. Я не понимаю, что в этом контексте «ws.title», «ws» и «dict».

Каков наилучший способ сохранить «x1» и «x2», затем закройте файл, откройте его и добавьте «x3» и «x4»?

ответ

9

спасибо. Я считаю, что полный пример может быть хорошо для тех, кто еще есть какой-то вопрос:

import pandas as pd 
import numpy as np 

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx" 

x1 = np.random.randn(100, 2) 
df1 = pd.DataFrame(x1) 

x2 = np.random.randn(100, 2) 
df2 = pd.DataFrame(x2) 

writer = pd.ExcelWriter(path, engine = 'xlsxwriter') 
df1.to_excel(writer, sheet_name = 'x1') 
df2.to_excel(writer, sheet_name = 'x2') 
writer.save() 
writer.close() 

Здесь я генерировать файл Excel, от моего понимания, что на самом деле не имеет значения, будь то генерируется через «xslxwriter» или движок openpyxl.

Когда я хочу писать без потери исходных данных, то

import pandas as pd 
import numpy as np 
from openpyxl import load_workbook 

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx" 

book = load_workbook(path) 
writer = pd.ExcelWriter(path, engine = 'openpyxl') 
writer.book = book 

x3 = np.random.randn(100, 2) 
df3 = pd.DataFrame(x3) 

x4 = np.random.randn(100, 2) 
df4 = pd.DataFrame(x4) 

df3.to_excel(writer, sheet_name = 'x3') 
df4.to_excel(writer, sheet_name = 'x4') 
writer.save() 
writer.close() 

этот код сделать работу!

6

В приведенном примере вы загружаете существующий файл в book и устанавливаете значение writer.book равным book. В строке writer.sheets = dict((ws.title, ws) for ws in book.worksheets) вы получаете доступ к каждому листу в книге как ws. Заголовок заголовка тогда ws, поэтому вы создаете словарь из {sheet_titles: sheet} ключ, пары значений. Затем этот словарь устанавливается в файле writer.sheets. По существу, эти шаги просто загружают существующие данные с 'Masterfile.xlsx' и заполняют их автором.

Теперь предположим, что у вас уже есть файл с x1 и x2 в качестве листов. Вы можете использовать пример кода для загрузки файла, а затем можете сделать что-то вроде этого, чтобы добавить и x4.

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx" 
writer = pd.ExcelWriter(path, engine='openpyxl') 
df3.to_excel(writer, 'x3', index=False) 
df4.to_excel(writer, 'x4', index=False) 
writer.save() 

Это должно делать то, что вы ищете.

5

Я настоятельно рекомендую вам работать непосредственно с openpyxl since it now supports Pandas DataFrames.

Это позволяет сконцентрироваться на соответствующем коде Excel и Pandas.

+0

Было бы очень полезно, если бы вы могли добавить несколько примеров «Pandas», похожих на [this] (http://xlsxwriter.readthedocs.io/working_with_pandas.html) – MaxU

+0

Я не очень много работаю с Pandas поэтому я не могу представить много примеров, но приветствую улучшения в документации. –

3

Простой пример для записи нескольких данных, которые могут быть использованы одновременно. А также, когда вы хотите добавить данные к листу в написанном файле excel (закрытый файл excel).

Когда вы впервые пишете превосходное. (Запись «DF1» и «df2» на «1st_sheet» и «2nd_sheet»)

import pandas as pd 
from openpyxl import load_workbook 

df1 = pd.DataFrame([[1],[1]], columns=['a']) 
df2 = pd.DataFrame([[2],[2]], columns=['b']) 
df3 = pd.DataFrame([[3],[3]], columns=['c']) 

excel_dir = "my/excel/dir" 

with pd.ExcelWriter(excel_dir, engine='xlsxwriter') as writer:  
    df1.to_excel(writer, '1st_sheet') 
    df2.to_excel(writer, '2nd_sheet') 
    writer.save()  

После закрытия вашего первенствовать, но вы хотите, чтобы «добавить» данные на тот же первенствует файл, но другой лист, скажем, "df3" на имя листа "3rd_sheet".

book = load_workbook(excel_dir) 
with pd.ExcelWriter(excel_dir, engine='openpyxl') as writer: 
    writer.book = book 
    writer.sheets = dict((ws.title, ws) for ws in book.worksheets)  

    ## Your dataframe to append. 
    df3.to_excel(writer, '3rd_sheet') 

    writer.save()  

Следует отметить, что формат excel не должен быть xls, вы можете использовать xlsx one.

+1

Я не вижу, что добавляет этот ответ. Фактически, повторное использование диспетчера контекста, подобного этому, будет включать в себя гораздо больше ввода-вывода. –

+1

Просто мое личное мнение, чтобы написать данные на новом листе написанного/закрытого файла excel. –