φυβλαςのβλογ
บล็อกของ phyblas



จัดการข้อมูลด้วย pandas เบื้องต้น บทที่ ๒๑: การจัดการกับไฟล์ excel (.xlsx, .xls)
เขียนเมื่อ 2021/04/15 20:25
แก้ไขล่าสุด 2021/09/28 16:42
pandas มีฟังก์ชันสำหรับอ่านข้อมูลจากไฟล์เอ็กซ์เซล (สกุล .xlsx หรือ .xls) มาเป็นเดตาเฟรม และมีเมธอดสำหรับเอาข้อมูลจากเดตาเฟรมบันทึกลงเป็นไฟล์เอ็กซ์เซล

เอ็กซ์เซลเองก็เป็นรูปแบบการเก็บข้อมูลในรูปแบบตารางที่ได้ใช้บ่อยมากอยู่อันหนึ่ง

ที่จริงไฟล์เอ็กซ์เซลสามารถแปลงเป็น .csv ได้ง่ายด้วยโปรแกรมไมโครซอฟต์เอ็กซ์เซล ถ้าแปลงแล้วค่อยใช้ pandas อ่านไฟล์ .csv ที่ได้นั้นอีกทีก็ได้เช่นกัน

แต่เมื่อสามารถอ่านเขียนไฟล์เอ็กซ์เซลได้โดยตรง ไม่ต้องทำผ่าน .csv ก็ย่อมสะดวกกว่า

ไพธอนมีมอดูลที่ใช้จัดการกับไฟล์เอ็กซ์เซลอยู่แล้ว ซึ่งภายใน pandas จะไปเรียกใช้มอดูลเหล่านั้นมาใช้อีกที ดังนั้นจึงจำเป็นต้องติดตั้งก่อนจึงจะใช้ความสามารถตรงนี้ได้

ในการอ่านไฟล์จะทำผ่านมอดูล xlrd ส่วนในการเขียนไฟล์จะใช้มอดูล openpyxl

ตอนที่ติดตั้ง pandas มอดูลเหล่านี้ไม่ได้ถูกติดตั้งให้ด้วยโดยอัตโนมัติ ต้องติดตั้งเพิ่มอีกที ซึ่งก็จัดการได้ง่ายโดยใช้ pip หรือ conda
pip install openpyxl
pip install xlrd

เมื่อมีเดตาเฟรมอยู่ สามารถแปลงเป็นไฟล์เอ็กซ์เซลได้ด้วยเมธอด .to_excel

ตัวอย่างเช่น
import pandas as pd

df = pd.DataFrame([
        ['ฟุชิงิดาเนะ',0.7,6.9],
        ['ฮิโตคาเงะ',None,8.5],
        ['เซนิงาเมะ',0.5]],
    columns=['สายพันธุ์','ส่วนสูง','น้ำหนัก'],
    index=[1,4,7])
df.to_excel('pokemon.xlsx')


จะได้



หากต้องการกำหนดชื่อหน้าก็ใส่ที่คีย์เวิร์ด sheet_name ถ้าไม่ใส่จะได้ชื่อ sheet_name='Sheet1'

ช่องที่ไม่มีข้อมูลจะถูกเว้นว่างไว้ แต่ถ้าหากต้องการให้ใส่ความความอะไรลงไปแทนการไม่มีข้อมูลก็กำหนดที่คีย์เวิร์ด na_rep

ตัวอย่างเช่น
df.to_excel('pokemon.xlsx',na_rep='ไม่มีข้อมูล')

ได้



สำหรับข้อมูลที่เป็นเลขทศนิยม อาจกำหนดรูปแบบการเขียนด้วยคีย์เวิร์ด float_format

เช่น ให้ปัดเศษเลขทศนิยมไปหมด
df.to_excel('pokemon.xlsx',float_format='%.0f')

ได้



หากต้องการข้อมูลแค่บางคอลัมน์ก็กำหนดที่คีย์เวิร์ด columns เช่น
df.to_excel('pokemon.xlsx',columns=['สายพันธุ์','ส่วนสูง'])

ได้



หากไม่ต้องการชื่อคอลัมน์ ให้ใส่ header=False เช่น
df.to_excel('pokemon.xlsx',header=False)

ได้



หากไม่ต้องการชื่อดัชนี ให้ใส่ index=False
df.to_excel('pokemon.xlsx',index=False)

ได้




หากต้องการกำหนดตำแหน่งแถวและคอลัมน์ที่เริ่มต้นวางให้ใส่ที่คีย์เวิร์ด startrow และ startcol
df.to_excel('pokemon.xlsx',startrow=2,startcol=1)

ได้



การใช้ .to_excel โดยใส่แค่ชื่อไฟล์ที่ต้องการบันทึกลงไปเลยนั้นจะใช้เขียนได้แค่ไฟล์ละหน้าเดียวเท่านั้น

หากต้องการเขียนหลายหลายหน้าพร้อมกันอาจทำได้โดยใช้ ExcelWriter ช่วย

วิธีการใช้นั้นคือใช้กับ with แล้วใส่ ตัว pd.ExcelWriter ลงไปแทนที่ชื่อไฟล์

เช่น
with pd.ExcelWriter('pokemon.xlsx') as ew:
    df.to_excel(ew)

แต่ตัวอย่างข้างต้นนี้เป็นการเขียนแค่หน้าเดียว ที่จริงจึงไม่จำเป็นต้องใช้ pd.ExcelWriter แบบนี้ใส่แค่ชื่อไฟล์เฉยๆก็ได้ผลเหมือนกัน

ตัวอย่างการสร้างไฟล์ที่มี ๒ หน้า เช่น

col = ['สายพันธุ์','ส่วนสูง','น้ำหนัก']
df1 = pd.DataFrame([
          ['คาระคาระ',0.4,6.5],
          ['การะการะ',1,45]],
      columns=col,index=[104,105])
df2 = pd.DataFrame([
          ['ซาวามูลาร์',1.5,49.8],
          ['เอบิวาลาร์',1.4,50.2]],
      columns=col,
      index=[106,107])

with pd.ExcelWriter('pokemon.xlsx') as ew:
    df1.to_excel(ew,sheet_name='pk1')
    df2.to_excel(ew,sheet_name='pk2')


ได้



นอกจากนี้ ExcelWriter ยังใช้เพื่อเขียนหน้าใหม่ลงในไฟล์ที่มีอยู่แล้วได้ โดยการเปิดด้วย mode='a'

เช่นลองเขียนทับไฟล์จากตัวอย่างที่แล้ว
df3 = pd.DataFrame([
          ['ไซฮอร์น',1,115],
          ['ไซดอน',1.9,120]],
      columns=['สายพันธุ์','ส่วนสูง','น้ำหนัก'],
      index=[111,112])

with pd.ExcelWriter('pokemon.xlsx',mode='a') as ew:
    df3.to_excel(ew,sheet_name='pk3')


ได้



ส่วนการอ่านข้อมูลจากไฟล์เอ็กซ์เซลทำได้โดยใช้ฟังก์ชัน pd.read_excel

ตัวอย่างเช่น ลองเปิดไฟล์เอ็กซ์เซลที่ได้จากตัวอย่างที่แล้วขึ้นมา
df = pd.read_excel('pokemon.xlsx')
print(df)

ได้
Unnamed: 0 สายพันธุ์  ส่วนสูง  น้ำหนัก
0         104  คาระคาระ      0.4      6.5
1         105  การะการะ      1.0     45.0

หากไม่ได้กำหนดว่าจะเอาหน้าไหน จะเป็นการอ่านข้อมูลหน้าแรกสุดหน้าเดียว แต่หากกำหนด sheet_name ก็จะอ่านหน้าที่กำหนด โดยจะใส่เป็นลำดับหน้าก็ได้ (โดยเริ่มไล่จากหน้าแรกคือ 0) หรือใส่ชื่อหน้าก็ได้

เช่นอ่านหน้าที่ ๒ ซึ่งมีชื่อหน้าว่า pk2
df = pd.read_excel('pokemon.xlsx',sheet_name='pk2')
# หรือ df = pd.read_excel('pokemon.xlsx',sheet_name=1)
print(df)

ได้
Unnamed: 0   สายพันธุ์  ส่วนสูง  น้ำหนัก
0         106  ซาวามูลาร์      1.5     49.8
1         107  เอบิวาลาร์      1.4     50.2

สามารถอ่านหลายหน้าพร้อมกันได้ โดยผลที่ได้จะออกมาในรูปดิกชันนารีของเดตาเฟรม

df = pd.read_excel('pokemon.xlsx',sheet_name=[0,'pk3'])
print(df)

ได้
{0:    Unnamed: 0 สายพันธุ์  ส่วนสูง  น้ำหนัก
0         104  คาระคาระ      0.4      6.5
1         105  การะการะ      1.0     45.0, 'pk3':    Unnamed: 0 สายพันธุ์  ส่วนสูง  น้ำหนัก
0         111   ไซฮอร์น      1.0      115
1         112     ไซดอน      1.9      120}
สามารถกำหนดคอลัมน์ที่จะใช้เป็นดัชนีได้โดยใส่ชื่อคอลัมน์นั้นที่คีย์เวิร์ด index_col วิธีใช้เหมือนกับใน pd.read_csv (ดูบทที่ ๓)

เช่น
df = pd.read_excel('pokemon.xlsx',index_col=0)
print(df)

ได้
สายพันธุ์  ส่วนสูง  น้ำหนัก
104  คาระคาระ      0.4      6.5
105  การะการะ      1.0     45.0

เช่นเช่นเดียวกันกับใน .read_csv สามารถกำหนดว่าจะเอาแค่บางคอลัมน์ได้โดยใส่ usecols

df = pd.read_excel('pokemon.xlsx',usecols=[1,2,3])
print(df)

ได้
สายพันธุ์  ส่วนสูง  น้ำหนัก
0  คาระคาระ      0.4      6.5
1  การะการะ      1.0     45.0

นอกจากนี้คีย์เวิร์ดอื่นๆเช่น skiprows, nrows, na_values, keep_default_na, dtype พวกนี้สามารถใช้ได้เช่นเดียวกับใน df.read_csv อ่านรายละเอียดได้ในบทที่ ๓

ตัวอย่าง
df1 = pd.read_excel('pokemon.xlsx',nrows=1)
df2 = pd.read_excel('pokemon.xlsx',skiprows=1)
print(df1)
print('---')
print(df2)

ได้
Unnamed: 0 สายพันธุ์  ส่วนสูง  น้ำหนัก
0         104  คาระคาระ      0.4      6.5
---
104  คาระคาระ  0.4  6.5
0  105  การะการะ    1   45



อ้างอิง


<< บทที่แล้ว บทถัดไป >>
หน้าสารบัญ


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python >> pandas

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文