Sử dụng Pandas để pd.read_excel () cho nhiều trang tính của cùng một sổ làm việc


165

Tôi có một 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. Nó xảy ra rằng 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à cái còn lại chỉ là một vài ô vuông.

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

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

Cảm ơn bạn!


Câu trả lời:


243

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ộ tệp Excel được đọc trong suốt ExcelFile()cuộc gọi (dường như không có cách nào khác). Đ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 một trang tính mới.

Lưu ý rằng sheet_nameđối số pd.read_excel()có thể là tên của trang tính (như trên), một số nguyên chỉ định số trang tính (ví dụ 0, 1, v.v.), danh sách tên hoặc chỉ mục trang tính 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à 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ả về trang tính đầu tiên (nghĩa là sheet_name=0).

Nếu Noneđược chỉ định, tất cả các tờ được trả lại, như một {sheet_name:dataframe}từ điển.


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

1
Câu trả lời này đã bị phản đối bởi gấu trúc và bây giờ gặp sự cố với tôi trong v0.21.0. Nó nên được thay thế bằng cái được đưa ra bởi @ Mat0kan.
DStauffman

1
@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 rằng điều này không được chấp nhận. Nếu bạn gặp sự cố với nó, tôi sẽ gửi một vấn đề trên github cho gấu trúc hoặc xlrd (thư viện phân tích cú pháp python excel được sử dụng bởi gấu trúc)
Noah

@ Không, cảm ơn tôi đã xem xét thêm một số điều này và bạn nói đúng, nó vẫn hoạt động miễn là tôi sử dụng sheet_namevà không sheetname. Tôi đã không nhận ra rằng đó là phần không dùng nữa, vì nó vẫn hoạt động trên phương thức read_excel, nhưng không phải là phương thức phân tích cú pháp.
DStauffman

@Noah Quả thực là một câu trả lời hay. Có cách nào để tìm ô đang hoạt động trong bảng excel mà bạn đọc không?
Eswar

97

Có 3 lựa chọn:

Đọc tất cả các tờ trực tiếp vào một từ điển theo thứ tự.

import pandas as pd

# for pandas version >= 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheet_name=None)

# for pandas version < 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheetname=None)

Cảm ơn @ihightower đã chỉ ra và @toto_tico đã chỉ ra vấn đề phiên bản.

Đọc bảng đầu tiên trực tiếp vào khung dữ liệu

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

Đọc tệp excel và nhận danh sách các tờ. Sau đó chọn và tải các tờ.

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

Đọc tất cả các tờ và lưu trữ nó trong một từ điển. Tương tự như đầu tiên nhưng rõ ràng hơn.

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

Cập nhật: Cảm ơn @toto_tico đã chỉ ra vấn đề phiên bản.

sheetname: chuỗi, int, danh sách hỗn hợp các chuỗi / ints hoặc Không có, mặc định 0 Không dùng nữa kể từ phiên bản 0.21.0: Sử dụng sheet_name thay vì Liên kết nguồn


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

32

Bạn cũng có thể sử dụng chỉ mục cho trang tính:

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

sẽ đưa ra bảng tính đầu tiên. cho bảng tính thứ hai:

sheet2 = xls.parse(1)

7
Trong trường hợp bạn muốn có một danh sách các tên trang tính, thay vì chỉ nhập xls.sheet_names
Stefano Fedele

28

Bạn cũng có thể chỉ định tên trang tính làm tham số:

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

sẽ chỉ tải lên trang tính "sheet_name".


9
pd.read_excel('filename.xlsx') 

theo mặc định đọc tờ đầu tiên của bảng tính.

pd.read_excel('filename.xlsx', sheet_name = 'sheetname') 

đọc bảng cụ thể của sổ làm việc và

pd.read_excel('filename.xlsx', sheet_name = None) 

đọc tất cả các bảng tính từ excel đến pandas dataframe dưới dạng một loại OrderedDict có nghĩa là các datafram lồng nhau, tất cả các bảng tính dưới dạng dataframes được thu thập trong dataframe và kiểu của nó là OrderedDict.


1

Có tiếc là nó sẽ luôn tải tập tin đầy đủ. Nếu bạn đang làm điều này nhiều lần có lẽ tốt nhất để trích xuất các trang tính để tách CSV và sau đó tải riêng. Bạn có thể tự động hóa quá trình đó với d6tstack , cũng bổ sung các tính năng bổ sung như kiểm tra xem tất cả các cột có bằng nhau trên tất cả các trang tính hay nhiều tệp Excel không.

import d6tstack
c = d6tstack.convert_xls.XLStoCSVMultiSheet('multisheet.xlsx')
c.convert_all() # ['multisheet-Sheet1.csv','multisheet-Sheet2.csv']

Xem ví dụ về d6tstack Excel


0

Nếu bạn đã lưu tệp excel trong cùng thư mục với chương trình python của bạn (Địa chỉ tương đối) thì bạn chỉ cần đề cập đến số trang tính cùng với tên tệp. Cú pháp = pd.read_excel (Tên tệp, Trang tính) Ví dụ:

    data=pd.read_excel("wt_vs_ht.xlsx","Sheet2")
    print(data)
    x=data.Height
    y=data.Weight
    plt.plot(x,y,'x')
    plt.show()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.