Làm cách nào để đọc tệp excel có tên trang tính trong pandas?

Trong công việc hàng ngày của mình, tôi làm việc với các tệp Excel khá nhiều - lấy các tệp Excel, hầu hết chứa nhiều trang tính và tải chúng vào Python bằng Pandas cho nhiều tác vụ khác nhau. Tôi thấy quy trình này khá rườm rà, cho đến khi một đồng nghiệp [cảm ơn Gab Lin. ] đã dạy tôi một thủ thuật đơn giản mà từ đó cho phép tôi thực hiện nhiệm vụ này một cách trực quan và hiệu quả hơn. Cho phép tôi trả nó về phía trước trong bài viết này. 🙂

Các mã được trình bày trong bài viết này có thể được tìm thấy tại repo GitHub này

Dữ liệu

Trước khi đi vào mấu chốt, trước tiên chúng ta hãy xem tệp Excel sau đây mà tôi đã tạo và sẽ sử dụng để minh họa

Tệp Excel có nhiều trang tính [GIF của Tác giả]

Nó chứa dữ liệu bán hàng hư cấu [và rất đơn giản] trong ba tháng liên tiếp - từ tháng 1 đến tháng 3. Dữ liệu bán hàng cho mỗi tháng được hiển thị trong các bảng tính riêng biệt

Những gì tôi đã làm trước đây và những hạn chế của nó

Giả sử mục tiêu của tôi là kết hợp dữ liệu từ tất cả các trang tính lại với nhau thành một Khung dữ liệu Pandas duy nhất. Để đạt được nhiệm vụ này, tôi đã từng làm như sau

  1. Nhận danh sách tên của tất cả các trang tính, sử dụng openpyxl hoặc pandas
  2. Lặp lại qua từng trang tính, phân tích cú pháp từng trang dưới dạng Khung dữ liệu Pandas và nối từng Khung dữ liệu vào danh sách khác
  3. Hợp nhất tất cả vào một DataFrame duy nhất bằng cách sử dụng pd.concat

Mã của tôi sẽ trông giống như thế này

Hình ảnh của tác giả

Như bạn có thể tưởng tượng, có một số vấn đề với cách tiếp cận này

  • Bạn có ít nhất 8 dòng mã để thực hiện một tác vụ đơn giản, khá kém hiệu quả
  • Bạn không thể tải tệp Excel vào Python mà không biết tên của các trang tính trước. Bạn cần một chút kỹ thuật đảo ngược — trước tiên bạn cần tìm ra tên của các trang tính trước khi chỉ định đối số sheet_name tương ứng trong hàm pd.read_excel[]
  • Bạn cần chỉ định tên chính xác của [các] trang tính bạn muốn tải. Điều này có thể đơn giản nếu bạn đang tải dữ liệu từ một trang tính hoặc nếu tên của trang tính đơn giản, nhưng điều này dễ xảy ra lỗi nếu bạn có nhiều trang tính hoặc nếu tên trang tính phức tạp
thủ thuật

Bây giờ, để giải quyết những vấn đề này, đây là mẹo — chỉ cần chỉ định đối số sheet_name

import pandas as pdwriter = pd.ExcelWriter['demo.xlsx', engine='xlsxwriter']writer.close[]
1 trong hàm pd.read_excel[]. Vâng, đơn giản như vậy. Hãy xem qua điều này

Bằng cách chỉ định

import pandas as pdwriter = pd.ExcelWriter['demo.xlsx', engine='xlsxwriter']writer.close[]
3 trong hàm pd.read_excel[], bạn sẽ có được một từ điển Pandas DataFrames, trong đó các khóa là tên của các trang tính và các giá trị là dữ liệu trong mỗi trang tính dưới dạng Pandas DataFrames

Hình ảnh của tác giả

Bây giờ, nếu bạn muốn phân tích dữ liệu từ một trang tính cụ thể — chẳng hạn như từ trang tính “Tháng hai”, bạn chỉ cần thực hiện điều này

Hình ảnh của tác giả

Lưu ý rằng điều này trả về một đối tượng Pandas DataFrame

Hoặc nếu bạn muốn kết hợp dữ liệu trên nhiều trang tính, bạn có thể thực hiện việc này

Hình ảnh của tác giả

Ở đây, chúng tôi chỉ định pandas0 trong pandas1 để các chỉ số của DataFrame kết quả chạy theo trình tự

TL; DR

Tóm lại, đoạn mã đầy đủ sẽ trông như thế này

Hoặc ở định dạng mà bạn có thể tải xuống và lưu lại để tham khảo sau này

Hình ảnh của Tác giả sử dụng Carbon

Bây giờ, bạn có ít dòng mã hơn, đồng nghĩa với việc mã hiệu quả hơn và dễ đọc hơn

Trước khi tôi kết luận, hãy lưu ý sự khác biệt nhỏ này trong hàm pd.read_excel[]

  • Đối với phiên bản của Pandas ≥ 0. 21. 0. pandas3
  • Đối với phiên bản Pandas

Chủ Đề