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



จัดการข้อมูลด้วย pandas เบื้องต้น บทที่ ๓: การอ่านข้อมูลจากไฟล์และเขียนลงไฟล์
เขียนเมื่อ 2016/09/25 13:42
ในบทที่แล้วได้พูดถึงการสร้างเดตาเฟรมขึ้นโดยตรงจากการใช้ 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

หมายเหตุ: สำหรับคนที่ใช้ไพธอนใน IDE บางตัวอาจมีข้อความขึ้น Warning เมื่อมีค่า 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



อ้างอิง


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


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

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

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

หมวดหมู่

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

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
python
-- numpy
-- matplotlib

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

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



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

  ค้นหาบทความ

  บทความแนะนำ

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

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

2019年

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

2018年

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

2017年

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

2016年

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

2015年

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

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

ไทย

日本語

中文