ใน
บทที่แล้วได้พูดถึงการสร้างเดตาเฟรมขึ้นโดยตรงจากการใช้ pd.DataFrame()
อย่างไร ก็ตามโดยทั่วไปแล้วข้อมูลที่เราจะนำมาวิเคราะห์นั้นมักจะมาจากไฟล์ ไฟล์ที่ใช้บันทึกข้อมูลนั้นอาจมีอยู่หลากหลายรูปแบบ มีทั้งที่เป็นไฟล์ข้อความและที่เป็นไบนารี ไฟล์ข้อความเองก็มีรูปแบบการบันทึกอยู่หลายรูปแบบ
ในที่นี้ที่จะพูดถึงเป็นหลักก็คือไฟล์ที่มีโครงสร้างเป็นตาราง ซึ่งเป็นรูปแบบที่อ่านเข้าใจง่ายและนำมาใช้กับ pandas ได้สะดวก
การอ่านข้อมูลตารางจากไฟล์ข้อความ เรื่องการอ่านข้อมูลที่เป็นตารางนั้นที่จริงเราสามารถทำได้โดยใช้คำสั่ง loadtxt ของ numpy เพื่อแปลงข้อมูลในตารางให้เป็นอาเรย์ ซึ่งเขียนไว้ในเนื้อหา
numpy เบื้องต้น บทที่ ๓๙ เพียงแต่ว่า np.loadtxt นั้นทำงานค่อนข้างช้า แต่สำหรับใน pandas นั้นมีคำสั่งคล้ายๆกันซึ่งใช้สำหรับสร้างเดตาเฟรมโดยเฉพาะอีกทั้งยังเร็ว กว่ามาก
คำสั่งนั้นคือ pd.read_csv โดยคำว่า csv ในที่นี้ย่อมาจาก comma-separated variables หมายถึงตัวแปรที่ถูกแบ่งคั่นด้วยจุลภาค , ดังนั้นโดยพื้นฐานแล้วคำสั่งนี้จะอ่านข้อมูลที่ใช้จุลภาคเป็นตัวคั่น แต่ก็ไม่จำเป็น เราจะใช้อะไรคั่นก็ได้ สามารถกำหนดลงในคีย์เวิร์ดตอนเรียกใช้
โดยพื้นฐานแล้วบรรทัดแรกจะเป็นบรรทัดที่เก็บชื่อคอลัมน์ ส่วนบรรทัดต่อๆไปจึงจะเป็นข้อมูล
ตัวอย่าง ลองสร้างไฟล์ชื่อ pokemon.txt ขึ้นมา เก็บข้อมูลของโปเกมอน ๓ ตัว แต่ละคอลัมน์คั่นด้วย ,
หมายเลข,สายพันธุ์,ชนิด,ส่วนสูง,น้ำหนัก
252,คิโมริ,พืช,0.5,5.0
255,อาชาโม,ไฟ,0.4,2.5
258,มิซึโงโรว,น้ำ,0.4,7.6
บันทึกไฟล์เสร็จแล้วจากนั้นก็เริ่มเขียนโค้ดเพื่ออ่านไฟล์โดยใช้คำสั่ง pd.read_csv เพื่ออ่านข้อมูลเข้ามาเป็นเดตาเฟรม
import pandas as pd
pokemon = pd.read_csv('pokemon.txt')
print(pokemon)
ได้
|
หมายเลข |
สายพันธุ์ |
ชนิด |
ส่วนสูง |
น้ำหนัก |
0 |
252 |
คิโมริ |
พืช |
0.5 |
5.0 |
1 |
255 |
อาชาโม |
ไฟ |
0.4 |
2.5 |
2 |
258 |
มิซึโงโรว |
น้ำ |
0.4 |
7.6 |
จะเห็นว่าได้เดตาเฟรมออกมาอย่างสวยงาม
หากต้องการใช้ตัวคั่นเป็นอย่างอื่นแทนก็ให้เพิ่มคีย์เวิร์ด sep เข้าไป เช่น ลองใช้ช่องว่างหนึ่งช่องเป็นตัวคั่นดู
บันทึกไฟล์ pokemon.txt ใหม่เป็น
หมายเลข สายพันธุ์ ชนิด ส่วนสูง น้ำหนัก
253 จุปเทิล พืช 0.9 21.6
256 วากะชาโม ไฟ,ต่อสู้ 0.9 19.5
259 นุมาครอว์ น้ำ,ดิน 0.7 28.0
pokemon = pd.read_csv('pokemon.txt',sep=' ')
print(pokemon)
ได้
|
หมายเลข |
สายพันธุ์ |
ชนิด |
ส่วนสูง |
น้ำหนัก |
0 |
253 |
จุปเทิล |
พืช |
0.9 |
21.6 |
1 |
256 |
วากะชาโม |
ไฟ,ต่อสู้ |
0.9 |
19.5 |
2 |
259 |
นุมาครอว์ |
น้ำ,ดิน |
0.7 |
28.0 |
เพียงแต่ว่าบางครั้งการแบ่งโดยใช้การเว้นช่องว่างแบบนี้อาจไม่ได้มีช่องว่างเพียง หนึ่งช่องแต่จะเป็นกี่ช่องก็ได้ไม่เท่ากัน การใช้ sep=' ' แบบนี้หากเจอช่องแบ่งที่เว้นวรรคมากกว่าหนึ่งช่องจะเกิดการอ่านผิดพลาดได้
เช่นเขียน pokemon.txt ใหม่เป็น
หมายเลข สายพันธุ์ ชนิด ส่วนสูง น้ำหนัก
254 จูไคน์ พืช 1.7 52.2
257 บาชาโม ไฟ,ต่อสู้ 1.9 52.0
260 ลากลาร์จ น้ำ,ดิน 1.5 81.9
กรณีแบบนี้ต้องใช้ sep='\s+'
pokemon = pd.read_csv('pokemon.txt',sep='\s+')
print(pokemon)
ได้
|
หมายเลข |
สายพันธุ์ |
ชนิด |
ส่วนสูง |
น้ำหนัก |
0 |
254 |
จูไคน์ |
พืช |
1.7 |
52.2 |
1 |
257 |
บาชาโม |
ไฟ,ต่อสู้ |
1.9 |
52.0 |
2 |
260 |
ลากลาร์จ |
น้ำ,ดิน |
1.5 |
81.9 |
\s+ ในที่นี้เป็นการเขียนแบบเรกูลาร์เอ็กซ์เพรชชัน (regex) ซึ่งจะไม่อธิบายรายละเอียดตรงนี้แต่มีเขียนเอาไว้ใน
https://phyblas.hinaboshi.com/20160922 หากเราจะกำหนดตัวคั่นเป็นตัวอื่นก็แค่เปลี่ยนค่า sep ให้เป็นตัวคั่นที่ต้องการ โดยสามารถเขียนในรูปของ regex ได้
นอกจากคำสั่ง pd.read_csv แล้วยังมี pd.read_table ซึ่งก็คล้ายๆกันเพียงแต่ต่างกันตรงที่ค่า sep พื้นบานจะเป็นแท็บ \t เท่านั้น นอกนั้นก็เหมือนกัน ดังนั้นจึงไม่มีความจำเป็นต้องใช้ แม้กรณีที่ต้องการใช้ตัวคั่นเป้น \t ก็ใช้ pd.read_csv แล้วใส่ sep='\t'
การกำหนดดัชนีขึ้นจากคอลัมน์ เดตาเฟรมที่อ่านมาได้นี้จะเห็นว่าดัชนีถูกกำหนดให้เป็น 0,1,2 โดยอัตโนมัติ แต่หากในชุดข้อมูลของเรานั้นมีคอลัมน์ที่ต้องการให้ใช้เป็นดัชนีอยู่แล้วก็ สามารถกำหนดให้เป็นดัชนีได้โดยใส่คีย์เวิร์ด index_col แล้วตามด้วยเลขลำดับของคอลัมน์นั้น
ตัวอย่าง เปิดไฟล์ pokemon.txt จากตัวอย่างที่แล้ว คราวนี้ต้องการใช้คอลัมน์ "หมายเลข" ซึ่งเป็นคอลัมน์แรก นั่นคือหมายเลข 0 ก็เขียนแบบนี้
pokemon = pd.read_csv('pokemon.txt',sep='\s+',index_col=0)
print(pokemon)
ได้
|
สายพันธุ์ |
ชนิด |
ส่วนสูง |
น้ำหนัก |
หมายเลข |
|
|
|
|
254 |
จูไคน์ |
พืช |
1.7 |
52.2 |
257 |
บาชาโม |
ไฟ,ต่อสู้ |
1.9 |
52.0 |
260 |
ลากลาร์จ |
น้ำ,ดิน |
1.5 |
81.9 |
คอลัมน์ที่จะนำมาใช้เป็นดัชนีอาจไม่ได้มีเพียงคอลัมน์เดียว หากต้องการดัชนีสองตัวขึ้นไปก็สามารถทำได้โดยใส่ index_col=ลิสต์ของคอลัมน์
ตัวอย่าง ขอยกข้อมูลโปเกมอนของรูบีกับแซฟไฟร์ขึ้นมา
เขียนไฟล์ pokemon.txt ใหม่เป็น
ลำดับ สายพันธุ์ ชื่อ เจ้าของ
1 มิซึโงโรว ซูซู รูบี
2 โปจิเอนา นานา รูบี
3 เอเนโกะ โคโค รูบี
1 อาชาโม ชาโม แซฟไฟร์
2 โคโคโดระ โดรารา แซฟไฟร์
3 ดอนฟาน ฟาโดโด แซฟไฟร์
pokemon = pd.read_csv('pokemon.txt',sep='\s+',index_col=[3,0])
print(pokemon)
ได้
|
|
สายพันธุ์ |
ชื่อ |
เจ้าของ |
ลำดับ |
|
|
รูบี |
1 |
มิซึโงโรว |
ซูซู |
2 |
โปจิเอนา |
นานา |
3 |
เอเนโกะ |
โคโค |
แซฟไฟร์ |
1 |
อาชาโม |
ชาโม |
2 |
โคโคโดระ |
โดรารา |
3 |
ดอนฟาน |
ฟาโดโด |
เรื่องของเดตาเฟรมที่มีดัชนีมากกว่าหนึ่งตัวนั้นค่อนข้างซับซ้อนและจะยังไม่กล่าวถึงเพิ่มเติมอีกในบทนี้ แต่จะไปพูดถึงใน
บทที่ ๑๐ การตัดข้อมูลที่ไม่เกี่ยวข้อง บ่อยครั้งที่ส่วนหัวของไฟล์ข้อมูลมักจะเป็นคำอธิบายต่างๆ ไม่ใช่ส่วนหนึ่งของตารางข้อมูล กรณีแบบนี้เราจำเป็นจำต้องระบุว่าจะให้ข้ามส่วนตรงนี้ไปโดยใช้คำสั่ง skiprows
ตัวอย่าง เขียนไฟล์ pokemon.txt ใหม่เป็น
ข้อมูลโปเกมอนในตำนานของเขตโฮวเอง
----------------
หมายเลข สายพันธุ์ ชนิด ส่วนสูง น้ำหนัก
380 ลาทีอัส มังกร,พลังจิต 1.4 40.0
381 ลาทีออส มังกร,พลังจิต 2.0 60.0
382 ไคโอกา น้ำ 4.5 352.0
383 กราดอน ดิน 3.5 950.0
384 เรย์ควาซา มังกร,บิน 7.0 206.5
จะเห็นว่า ๒ แถวแรกเป็นข้อมูลที่ไม่เกี่ยวข้อง ดังนั้นจึงต้องสั่งให้ข้ามไปโดย skiprows=2
pokemon = pd.read_csv('pokemon.txt',sep='\s+',index_col=0,skiprows=2)
print(pokemon)
ได้
|
สายพันธุ์ |
ชนิด |
ส่วนสูง |
น้ำหนัก |
หมายเลข |
|
|
|
|
380 |
ลาทีอัส |
มังกร,พลังจิต |
1.4 |
40.0 |
381 |
ลาทีออส |
มังกร,พลังจิต |
2.0 |
60.0 |
382 |
ไคโอกา |
น้ำ |
4.5 |
352.0 |
383 |
กราดอน |
ดิน |
3.5 |
950.0 |
384 |
เรย์ควาซา |
มังกร,บิน |
7.0 |
206.5 |
นอกจากนี้ยังมีอีกวิธีคือใช้คีย์เวิร์ด header แทน โดยคีย์เวิร์ดนี้เป็นตัวกำหนดว่าแถวไหนที่จะเป็นตัวกำหนดชื่อคอลัมน์ โดยจะข้ามแถวที่อยู่ก่อนหน้า และแถวที่อยู่ต่อจากแถวนั้นก็จะเริ่มนับเป็นข้อมูล
ดังนั้นเขียนเช่นนี้จะได้ผลเช่นเดียวกับตัวอย่างที่แล้ว
pokemon = pd.read_csv('pokemon.txt',sep='\s+',index_col=0,header=2)
นอกจากนี้ บางครั้งข้อมูลอาจไม่ได้มีการเตรียมชื่อคอลัมน์เอาไว้ให้ หรือมีแต่เราไม่ต้องการใช้ กรณีแบบนี้ให้ใส่ header=None
ตัวอย่างเช่น เขียน pokemon.txt ใหม่เป็น
265 เคมุสโซ 0.3 3.6
283 อาเมทามะ 0.5 1.7
290 ทสึจินิน 0.5 5.5
pokemon = pd.read_csv('pokemon.txt',sep='\s+',header=None)
print(pokemon)
ได้
|
0 |
1 |
2 |
3 |
0 |
265 |
เคมุสโซ |
0.3 |
3.6 |
1 |
283 |
อาเมทามะ |
0.5 |
1.7 |
2 |
290 |
ทสึจินิน |
0.5 |
5.5 |
จะเห็นว่าพอไม่มีรายชื่อคอลัมน์อยู่ที่หัวแบบนี้แล้วชื่อคอลัมน์จะกลายเป็นหมายเลข 0,1,2,3 ไป
กรณีนี้หากต้องการกำหนดชื่อคอลัมน์เองก็สามารถทำได้โดยใส่คีย์เวิร์ด names เป็นลิสต์ของชื่อคอลัมน์ เช่น
n = ['หมายเลข','สายพันธุ์','ส่วนสูง','น้ำหนัก']
pokemon = pd.read_csv('pokemon.txt',sep='\s+',header=None,names=n)
print(pokemon)
ได้
|
หมายเลข |
สายพันธุ์ |
ส่วนสูง |
น้ำหนัก |
0 |
265 |
เคมุสโซ |
0.3 |
3.6 |
1 |
283 |
อาเมทามะ |
0.5 |
1.7 |
2 |
290 |
ทสึจินิน |
0.5 |
5.5 |
การเอาข้อมูลเฉพาะถึงแถวที่ต้องการ บางครั้งข้อมูลที่อยู่ในไฟล์มันก็เยอะแล้วเราไม่ได้ต้องการอ่านทั้งหมดจนจบ หากไม่ต้องการอ่านถึงท้ายไฟล์ก็สามารถทำได้โดยกำหนดคีย์เวิร์ด nrows เพื่อบอกว่าจะอ่านแค่กี่แถวก็พอ
ตัวอย่าง เขียนไฟล์ pokemon.txt เป็น
หมายเลข สายพันธุ์ ชนิด ส่วนสูง น้ำหนัก
351 วาโปเลิน ธรรมดา 0.3 0.8
352 คาคุเรออน ธรรมดา 1.0 22.0
353 คาเงะโบวซึ ผี 03. 2.3
354 จูเพ็ตตา ผี 1.1 12.5
355 โยมาวารุ ผี 0.8 15.0
356 ซามาโยวรุ ผี 1.6 30.6
357 โทรปิอุส พืช,บิน 2.0 100.0
358 ชิรีน พลังจิต 0.6 1.0
359 อับโซล มาร 1.2 47.0
360 โซนาโน พลังจิต 0.6 14.0
เปิดอ่านไฟล์ กำหนดให้เอาแค่ ๔ แถว
pokemon = pd.read_csv('pokemon.txt',sep='\s+',nrows=4)
print(pokemon)
ได้
|
หมายเลข |
สายพันธุ์ |
ชนิด |
ส่วนสูง |
น้ำหนัก |
0 |
351 |
วาโปเลิน |
ธรรมดา |
0.3 |
0.8 |
1 |
352 |
คาคุเรออน |
ธรรมดา |
1.0 |
22.0 |
2 |
353 |
คาเงะโบวซึ |
ผี |
3.0 |
2.3 |
3 |
354 |
จูเพ็ตตา |
ผี |
1.1 |
12.5 |
การเอาข้อมูลเฉพาะคอลัมน์ที่ต้องการ ในบางครั้งเราก็อาจไม่ได้ต้องการนำข้อมูลทั้งหมดจากไฟล์มาลงเดตาเฟรม กรณีแบบนี้ต้องใช้คำสั่ง usecols แล้วใส่ลิสต์ของคอลัมน์ที่ต้องการ
ตัวอย่าง เขียนไฟล์ pokemon.txt เป็น
หมายเลข สายพันธุ์ ชนิด ส่วนสูง น้ำหนัก
266 คาราซาลิส แมลง 0.3 3.6
268 มายูลด์ แมลง 0.7 11.5
284 อาเมมอธ แมลง,บิน 0.8 3.6
291 เท็กกะนิน แมลง,บิน 0.8 12.0
ถ้าเราต้องการแค่ข้อมูลหมายเลขกับสายพันธุ์และน้ำหนักก็เขียนแบบนี้
pokemon = pd.read_csv('pokemon.txt',sep='\s+',usecols=[0,1,4])
print(pokemon)
ได้
|
หมายเลข |
สายพันธุ์ |
น้ำหนัก |
0 |
266 |
คาราซาลิส |
3.6 |
1 |
268 |
มายูลด์ |
11.5 |
2 |
284 |
อาเมมอธ |
3.6 |
3 |
291 |
เท็กกะนิน |
12.0 |
การอ่านข้อมูลที่มีส่วนขาดหาย (NaN, NA) ปกติแล้วเมื่อใช้ read_csv อ่านไฟล์หากเจอข้อความว่า nan, NA, N/A, NULL หรืออะไรก็ตามที่มักใช้เพื่อแทนการไม่มีข้อมูล จะถูกตีความเป็นการไม่มีข้อมูลทันที ซึ่งจะถูกแสดงเป็น NaN ในตารางเดตาเฟรม
ตัวอย่าง ลองเขียนไฟล์ pokemon.txt ใหม่ให้มีพวกข้อมูลมี่ขาดหายอยู่
หมายเลข สายพันธุ์ ชนิด ส่วนสูง น้ำหนัก
339 โดจ็อช น้ำ,ดิน 0.4 NULL
341 เฮย์งานิ น้ำ 0.6 11.5
349 ฮินบาส NA 0.6 7.4
363 ทามะซาราชิ น้ำแข็ง,น้ำ nan 39.5
366 เพอร์ลูลู น้ำ 0.4 52.5
369 จีลานธ์ น้ำ,หิน 1.0 N/A
pokemon = pd.read_csv('pokemon.txt',sep='\s+')
print(pokemon)
ได้
|
หมายเลข |
สายพันธุ์ |
ชนิด |
ส่วนสูง |
น้ำหนัก |
0 |
339 |
โดจ็อช |
น้ำ,ดิน |
0.4 |
NaN |
1 |
341 |
เฮย์งานิ |
น้ำ |
0.6 |
11.5 |
2 |
349 |
ฮินบาส |
NaN |
0.6 |
7.4 |
3 |
363 |
ทามะซาราชิ |
น้ำแข็ง,น้ำ |
NaN |
39.5 |
4 |
366 |
เพอร์ลูลู |
น้ำ |
0.4 |
52.5 |
5 |
369 |
จีลานธ์ |
น้ำ,หิน |
1.0 |
NaN |
การที่ pandas ตรวจจับค่า NaN ให้อัตโนมัติแบบนี้แม้จะสะดวกแต่ว่าบ่อยครั้งที่เราอาจต้องการให้ NA หรือ nan นั้นแทนข้อความตามนั้นจริงๆ กรณีแบบนี้ต้องใส่คีย์เวิร์ด keep_default_na=0
หรือหากต้องการใช้ค่าอื่นแทนการไม่มีข้อมูล เราสามารถกำหนดข้อความที่จะใช้แทนการไม่มีข้อมูลได้โดยคีย์เวิร์ด na_values
ตัวอย่าง เขียนไฟล์ pokemon.txt ตามนี้
หมายเลข สายพันธุ์ ชนิด ส่วนสูง น้ำหนัก
339 โดจ็อช น้ำ,ดิน 0.4 -
341 เฮย์งานิ น้ำ 0.6 11.5
349 ฮินบาส NULL 0.6 7.4
363 ทามะซาราชิ น้ำแข็ง,น้ำ ไม่มีข้อมูล 39.5
366 เพอร์ลูลู น้ำ 0.4 52.5
369 จีลานธ์ น้ำ,หิน 1.0 -
pokemon = pd.read_csv('pokemon.txt',sep='\s+',
na_values=['ไม่มีข้อมูล','-'],
keep_default_na=0)
print(pokemon)
ได้
|
หมายเลข |
สายพันธุ์ |
ชนิด |
ส่วนสูง |
น้ำหนัก |
0 |
339 |
โดจ็อช |
น้ำ,ดิน |
0.4 |
NaN |
1 |
341 |
เฮย์งานิ |
น้ำ |
0.6 |
11.5 |
2 |
349 |
ฮินบาส |
NULL |
0.6 |
7.4 |
3 |
363 |
ทามะซาราชิ |
น้ำแข็ง,น้ำ |
NaN |
39.5 |
4 |
366 |
เพอร์ลูลู |
น้ำ |
0.4 |
52.5 |
5 |
369 |
จีลานธ์ |
น้ำ,หิน |
1.0 |
NaN |
จะเห็นว่าคราวนี้ "ไม่มีข้อมูล" กับ "-" ถูกตีความเป็น NaN แต่ NULL กลับกลายเป็นข้อความคำว่า NULL ธรรมดาไป
สรุปคีย์เวิร์ดที่ใช้ใน pd.read_csv
คีย์เวิร์ด |
ความหมาย |
ค่าตั้งต้น |
sep |
ตัวคั่น |
, |
delimiter |
เหมือนกับ sep ใช้แทนกันได้ |
, |
header |
บรรทัดที่จะใช้เป็นหัว |
บรรทัดแรก |
names |
ชื่อคอลัมน์ทั้งหมด ใช้เมื่อ header=None |
[0,1,2,...] |
index_col |
คอลัมน์ที่จะใช้เป็นดัชนี |
None |
usecols |
กำหนดคอลัมน์ที่จะเอา |
เอาทุกคอลัมน์ |
skiprows |
จำนวนแถวส่วนหัวที่ไม่เกี่ยวข้องกับตาราง |
0 |
nrows |
จำนวนแถวของข้อมูลที่จะเอา |
เอาจนถึงสุดไฟล์ |
na_values |
กำหนดค่าที่จะใช้แทนการไม่มีข้อมูล |
NaN, NA, ฯลฯ |
keep_default_na |
จะใช้ค่า NaN มาตรฐานหรือไม่ |
1 |
dtype |
ชนิดของข้อมูลแต่ละคอลัมน์ |
กำหนดอัตโนมัติ |
ทั้งหมดนี้เป็นแค่ส่วนหนึ่งเท่านั้น ยังมีคีย์เวิรืดอีกมากมายที่ไม่ได้กล่าวถึงเพราะเป็นเรื่องค่อนข้างลึกลงไปอีก หากสนใจสามารถค้นเพิ่มเติมได้
การเขียนเดตาเฟรมลงไฟล์ สิ่งที่ตรงข้ามกับการอ่านก็คือการเขียน เมื่อเราเปิดไฟล์เอาข้อมูลในตารางมาลงเดตาเฟรมแล้วจัดการทำอะไรเสร็จ เรียบร้อยก็ได้เวลาเอาข้อมูลนั้นมาบันทึกลงในไฟล์ใหม่
คำสั่งที่ใช้ในการเขียนเดตาเฟรมลงเป็นไฟล์ก็คือเมธอด to_csv ของเดตาเฟรม
คีย์เวิร์ดที่ใช้สำหรับเมธอดนี้มีดังนี้
คีย์เวิร์ด |
ความหมาย |
ค่าตั้งต้น |
sep |
ตัวคั่น |
, |
na_rep |
ค่าที่แทน NaN |
'' |
float_format |
รูปแบบของข้อมูลที่เป็น float |
|
columns |
เลือกบางคอลัมน์ที่จะเขียน |
|
header |
จะบันทึกส่วนชื่อคอลัมน์ด้วยหรือไม่ |
1 |
index |
จะบันทึกคอลัมน์ดัชนีลงไปด้วยหรือไม่ |
1 |
ตัวอย่าง
pokemon = pd.DataFrame([
['ลีลีลา','หิน,พืช',1.0,23.8],
['ยูเรเดิล','หิน,พืช',1.5,60.4],
['อาโนปธ์','หิน,แมลง',0.7,12.5],
['อาร์มัลโด','หิน,แมลง',1.5,68.2]
],
columns=['สายพันธุ์','ชนิด','ส่วนสูง','น้ำหนัก'],
index=[345,346,347,348])
pokemon.to_csv('pokemon.txt')
เปิดไฟล์ pokemon.txt ดูได้
,สายพันธุ์,ชนิด,ส่วนสูง,น้ำหนัก
345,ลีลีลา,"หิน,พืช",1.0,23.8
346,ยูเรเดิล,"หิน,พืช",1.5,60.4
347,อาโนปธ์,"หิน,แมลง",0.7,12.5
348,อาร์มัลโด,"หิน,แมลง",1.5,68.2
กรณีที่ไม่ได้กำหนดตัวคั่นด้วยคีย์เวิร์ด sep ข้อมูลจะถูกคั่นด้วย , แต่ในตัวอย่างนี้คอลัมน์ "ชนิด" มี , อยู่ด้วยโปรแกรมจึงใส่เครื่องหมายคำพูดล้อมให้โดยอัตโนมัติ
หากสั่ง pd.read_csv('pokemon.txt') ก็จะพบว่าได้เดตาเฟรมชุดเดิมกลับมา
รูปแบบการแสดงผลของข้อมูลที่เป็นจำนวนจริงก็สามารถปรับได้ตามที่ต้องการโดยใช้ คีย์เวิร์ด float_format เช่นถ้าต้องการให้มีทศนิยม 3 ตำแหน่งก็ใส่ %.3f
ตัวอย่าง ใช้ข้อมูลชุดเดิมแต่ใส่คีย์เวิร์ดเพิ่ม
pokemon.to_csv('pokemon.txt',sep=' ',float_format='%.3f',header=0,index=0)
เปิดไฟล์ดูได้
ลีลีลา หิน,พืช 1.000 23.800
ยูเรเดิล หิน,พืช 1.500 60.400
อาโนปธ์ หิน,แมลง 0.700 12.500
อาร์มัลโด หิน,แมลง 1.500 68.200
อ้างอิง