บทนำ
ดูเหมือนโลกถูกควบคุมโดย Excel หลายองค์กรใช้ Excel เป็นเครื่องมือตัดสินใจสำคัญ แม้จะไม่ชอบ MS Office ก็ต้องจัดการไฟล์ Excel ขนาดใหญ่ได้อย่างมีประสิทธิภาพ
พื้นฐานการจัดการ Excel กับ Pandas
- ติดตั้ง
openpyxlและxlwt - สร้างไฟล์ Excel ด้วย
xlsxwriter - อ่านเข้า Pandas DataFrame
- เขียน DataFrame กลับไป Excel
ฟังก์ชันสร้างไฟล์ Excel
import xlsxwriter
def write_data_to_files(inp_data, inp_file_name):
workbook = xlsxwriter.Workbook(inp_file_name)
worksheet = workbook.add_worksheet()
row, col = 0, 0
for player, titles in inp_data:
worksheet.write(row, col, player)
worksheet.write(row, col + 1, titles)
row += 1
workbook.close()
ฟังก์ชันอ่าน/เขียน Excel ด้วย Pandas
import pandas as pd
def excel_functions_with_pandas(inp_file_name):
data = pd.read_excel(inp_file_name)
print(data.head())
print(data.info())
# สร้าง Sheet2 ใหม่
new_players_info = pd.DataFrame([...])
new_data = pd.ExcelWriter(inp_file_name)
new_players_info.to_excel(new_data, sheet_name="Sheet2")
ประมวลผล Excel แบบ Chunk (Pandas ไม่รองรับ chunks สำหรับ Excel โดย default)
โค้ดด้านล่างอ่าน Excel ทีละ chunk (เช่น 1000 แถว) โดยใช้ skiprows และ nrows
def global_excel_to_db_chunks(file_name, nrows):
chunks = []
i_chunk = 0
skiprows = 1 # skip header
df_header = pd.read_excel(file_name, nrows=1)
while True:
df_chunk = pd.read_excel(file_name, nrows=nrows, skiprows=skiprows, header=None)
skiprows += nrows
if not df_chunk.shape[0]: # ไม่มีข้อมูล
break
else:
print(f" ** Reading chunk number {i_chunk} with {df_chunk.shape[0]} Rows")
chunks.append(df_chunk)
i_chunk += 1
df_chunks = pd.concat(chunks)
# rename columns to match header
columns = {i: col for i, col in enumerate(df_header.columns.tolist())}
df_chunks.rename(columns=columns, inplace=True)
df = pd.concat([df_header, df_chunks])
print('*** Reading is Completed in chunks...')
ตัวอย่างรันกับไฟล์ 9,994 แถว chunk 1,000 แถว
file_name = 'Sample-sales-data-excel.xls'
stats = pd.read_excel(file_name)
print(f"Total rows: {len(stats.index)}")
global_excel_to_db_chunks(file_name, 1000)
ผลลัพธ์
Total rows: 9994
** Reading chunk number 0 with 1000 Rows
** Reading chunk number 1 with 1000 Rows
...
** Reading chunk number 9 with 994 Rows
*** Reading is Completed in chunks...
สรุป
- Pandas
read_excelไม่มีพารามิเตอร์chunksizeเหมือนread_csv - ใช้
skiprows+nrowsใน while loop อ่านทีละ chunk - อ่าน header แยกก่อน แล้ว rename columns ของ chunks ให้ตรง
- เหมาะสำหรับไฟล์ Excel ใหญ่ที่โหลดทั้งไฟล์หน่วยความจำไม่พอ