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



จัดการข้อมูลด้วย pandas เบื้องต้น บทที่ ๒๑: การจัดการกับไฟล์ excel (.xlsx, .xls)
เขียนเมื่อ 2021/04/15 20:25
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
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
maya
javascript
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
เรียนภาษาจีน
qiita
บทความอื่นๆ

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



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

  ค้นหาบทความ

  บทความแนะนำ

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

ไทย

日本語

中文