2017-02-21 21 views
10

Tôi muốn sử dụng các tệp excel để lưu trữ dữ liệu được xây dựng bằng python. Vấn đề của tôi là tôi không thể thêm trang tính vào tệp excel hiện có. Ở đây tôi đề nghị một mẫu mã để làm việc với để đạt được vấn đề nàyLàm thế nào để lưu một trang tính mới trong một tệp excel hiện có, sử dụng 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() 

Mã này tiết kiệm hai DataFrames đến hai tờ, có tên là "x1" và "x2" tương ứng. Nếu tôi tạo hai DataFrames mới và cố gắng sử dụng cùng một mã để thêm hai trang tính mới, 'x3' và 'x4', dữ liệu gốc bị mất.

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() 

Tôi muốn tệp excel có bốn trang tính: 'x1', 'x2', 'x3', 'x4'. Tôi biết rằng 'xlsxwriter' không phải là "động cơ" duy nhất, có 'openpyxl'. Tôi cũng thấy đã có những người khác đã viết về vấn đề này, nhưng tôi vẫn không thể hiểu làm thế nào để làm điều đó.

Dưới đây là một mã lấy từ này 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() 

Họ nói rằng nó hoạt động, nhưng thật khó để tìm ra cách. Tôi không hiểu "ws.title", "ws" và "dict" là gì trong ngữ cảnh này.

Cách tốt nhất để lưu "x1" và "x2", sau đó đóng tệp, mở lại và thêm "x3" và "x4"?

Trả lời

9

Cảm ơn bạn. Tôi tin rằng một ví dụ hoàn chỉnh có thể là tốt cho bất cứ ai khác có một số vấn đề:

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() 

Ở đây tôi tạo ra một file excel, từ hiểu biết của tôi nó không thực sự quan trọng cho dù nó được tạo ra thông qua "xslxwriter" hoặc "openpyxl" engine.

Khi tôi muốn viết mà không mất dữ liệu gốc sau đó

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() 

mã này thực hiện công việc!

6

Trong ví dụ bạn đã chia sẻ, bạn đang tải tệp hiện có vào book và đặt giá trị writer.book thành book. Trong dòng writer.sheets = dict((ws.title, ws) for ws in book.worksheets) bạn đang truy cập từng trang tính trong sổ làm việc dưới dạng ws. Tiêu đề trang tính sau đó là ws để bạn tạo từ điển gồm các cặp khóa, giá trị {sheet_titles: sheet}. Từ điển này sau đó được đặt thành writer.sheets. Về cơ bản, các bước này chỉ tải dữ liệu hiện có từ 'Masterfile.xlsx' và điền văn bản của bạn vào chúng.

Bây giờ, giả sử bạn đã có tệp với x1x2 làm trang tính. Bạn có thể sử dụng mã ví dụ để tải tệp và sau đó có thể làm điều gì đó như thế này để thêm và 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() 

Điều đó sẽ làm những gì bạn đang tìm kiếm.

5

Tôi thực sự khuyên bạn nên làm việc trực tiếp với openpyxl since it now supports Pandas DataFrames.

Điều này cho phép bạn tập trung vào mã Excel và Pandas có liên quan.

+0

Sẽ rất hữu ích nếu bạn có thể thêm nhiều ví dụ "Pandas" tương tự như [this] (http://xlsxwriter.readthedocs.io/working_with_pandas.html) – MaxU

+0

Tôi không làm nhiều việc với Pandas bản thân tôi nên tôi không thể cung cấp nhiều ví dụ nhưng sẽ hoan nghênh các cải tiến đối với tài liệu. –

3

Một ví dụ đơn giản để viết nhiều dữ liệu để xuất sắc cùng một lúc. Và cũng có thể khi bạn muốn nối thêm dữ liệu vào một trang tính trên tệp excel bằng văn bản (tệp excel đã đóng).

Khi đó là lần đầu tiên bạn viết thư cho một excel. (Viết "df1" và "df2" thành "1st_sheet" và "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()  

Sau khi bạn đóng excel của bạn, nhưng bạn muốn "thêm" dữ liệu trên cùng một file excel nhưng tờ khác, giả sử "df3" vào tên trang tính "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()  

Lưu ý rằng định dạng excel không được là xls, bạn có thể sử dụng xlsx.

+1

Tôi không thấy câu trả lời này thêm vào. Thực tế, việc sử dụng lặp lại một trình quản lý ngữ cảnh như thế này sẽ liên quan đến nhiều I/O hơn. –

+1

Chỉ cần ý kiến ​​cá nhân của tôi để ghi dữ liệu trên một trang tính mới của tập tin excel được viết/đóng. –

Các vấn đề liên quan