2014-10-23 13 views
31

Tôi có tệp bảng tính lớn (.xlsx) mà tôi đang xử lý bằng cách sử dụng gấu trúc python. Điều đó xảy ra là tôi cần dữ liệu từ hai tab trong tệp lớn đó. Một trong các tab có rất nhiều dữ liệu và một tab khác chỉ là một vài ô vuông.Sử dụng Pandas để pd.read_excel() cho nhiều trang tính của cùng một sổ làm việc

Khi tôi sử dụng pd.read_excel() trên bất kỳ bảng, có vẻ với tôi như toàn bộ tập tin được nạp (không chỉ là bảng Tôi quan tâm đến). Vì vậy, khi tôi sử dụng các phương pháp hai lần (một lần cho mỗi tờ), tôi có hiệu quả phải chịu toàn bộ bảng tính được đọc trong hai lần (mặc dù chúng tôi chỉ sử dụng tờ được chỉ định).

Tôi có sử dụng sai hoặc chỉ bị giới hạn theo cách này?

Cảm ơn bạn!

Trả lời

39

Hãy thử pd.ExcelFile:

xls = pd.ExcelFile('path_to_file.xls') 
df1 = pd.read_excel(xls, 'Sheet1') 
df2 = pd.read_excel(xls, 'Sheet2') 

Theo ghi nhận của @HaPsantran, toàn bộ file Excel được đọc trong trong ExcelFile() cuộc gọi (có vẻ không phải một khoảng cách này). Điều này chỉ giúp bạn không phải đọc cùng một tệp trong mỗi lần bạn muốn truy cập trang tính mới.

Lưu ý rằng đối số sheet_name đến pd.read_excel() có thể là tên của trang tính (như trên), số nguyên chỉ định số trang tính (ví dụ 0, 1, v.v.), danh sách tên trang hoặc chỉ mục hoặc None. Nếu một danh sách được cung cấp, nó sẽ trả về một từ điển trong đó các khóa là các tên/chỉ mục trang tính và các giá trị là các khung dữ liệu. Mặc định là chỉ cần trả lại trang tính đầu tiên (ví dụ: sheet_name=0).

Nếu None được chỉ định, tất cả trang tính sẽ được trả lại, dưới dạng {sheet_name:dataframe} từ điển.

+1

FWIW, nó trông giống như (lần cuối cùng tôi thử nghiệm nó) tải dòng đầu tiên trong * mọi *, vì vậy không có cách nào để hiệu quả kéo chỉ trong một trang tính, nhưng ít nhất nhận được nhiều trang tính không yêu cầu nhiều tải của toàn bộ trang tính. – HaPsantran

+0

Câu trả lời này đã không được chấp nhận bởi gấu trúc và bây giờ bị treo cho tôi trong v0.21.0. Nó sẽ được thay thế bằng cái được đưa ra bởi @ Mat0kan. – DStauffman

+0

@DStauffman Điều này vẫn hoạt động tốt đối với tôi và tôi không thấy dấu hiệu nào từ mã hoặc tài liệu mà điều này không được chấp nhận. Nếu bạn gặp rắc rối với nó, tôi sẽ gửi một vấn đề trên github cho gấu trúc hoặc xlrd (python excel phân tích thư viện được sử dụng bởi gấu trúc) – Noah

17

Bạn cũng có thể sử dụng các chỉ số cho bảng:

xls = pd.ExcelFile('path_to_file.xls') 
sheet1 = xls.parse(0) 

sẽ cung cấp cho các bảng tính đầu tiên. cho bảng thứ hai:

sheet2 = xls.parse(1) 
+4

Trong trường hợp bạn muốn danh sách tên trang tính, chỉ cần nhập xls.sheet_names –

11

Bạn cũng có thể chỉ định tên sheet như một tham số:

data_file = pd.read_excel('path_to_file.xls', sheetname="sheet_name") 

sẽ chỉ tải lên các tấm "SHEET_NAME"

9

Có 3 lựa chọn:

  1. Đọc trang tính đầu tiên trực tiếp vào khung dữ liệu
  2. Đọc tệp excel và nhận danh sách các trang tính. Sau đó chọn và tải các tờ.
  3. Đọc tất cả các trang tính và lưu trữ nó trong từ điển.

Mã mẫu:

import pandas as pd 

df = pd.read_excel('excel_file_path.xls') 
# this will read the first sheet into df 

xls = pd.ExcelFile('excel_file_path.xls') 

# Now you can list all sheets in the file 
xls.sheet_names 
# ['house', 'house_extra', ...] 

# to read just one sheet to dataframe: 
df = pd.read_excel(file_name, sheetname="house") 

# to read all sheets to a map 
sheet_to_df_map = {} 
for sheet_name in xls.sheet_names: 
    sheet_to_df_map[sheet_name] = xls.parse(sheet_name) 

UPDATE:

# @ihightower pointed out in the comments that all sheets can be 
# directly read into an ordered dictionary in 1 step 
sheet_to_df_map = pd.read_excel(file_name, sheetname=None) 
+3

trong gấu trúc mới nhất mà tôi có (0,20.3), để đọc tất cả trang tính đến bản đồ .. tất cả những gì được yêu cầu là 'df_sheet_map = pd .read_excel (file_fullpath, sheetname = None) ', điều này sẽ có các trang tính trong một từ điển tự động .. và truy cập trang tính dưới dạng dataframe như sau:' df_sheet_map ['house'] ' – ihightower

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