ในบทแรกได้แนะนำ pandas เบื้องต้น โดยได้พูดถึงข้อมูลชนิด
ซีรีส์ (Series) ไป และในบทนี้จะมาพูดถึง
เดตาเฟรม (DataFrame) ซึ่งเกิดจากหลายซีรีส์มารวมกัน และเป็นออบเจ็กต์หลักที่จะใช้งานใน pandas
การสร้างเดตาเฟรม เดตาเฟรมสามารถถูกสร้างขึ้นได้โดยใช้ pd.DataFrame() โดยวิธีการสร้างนั้นหลากหลายวิธีมาก จะขอเริ่มแนะนำบางส่วนก่อน
วิธีที่ง่ายที่สุดก็คือสร้างขึ้นจากลิสต์ที่มีสองมิติ
ตัวอย่าง สร้างตารางข้อมูลของโปเกมอน ซึ่งข้อมูลประกอบไปด้วยสายพันธุ์, ชนิด, ส่วนสูง และน้ำหนัก ข้อมูลแต่ละอย่างใส่ในคนละหลัก (คอลัมน์) และหนึ่งแถวคือโปเกมอนหนึ่งตัว
import pandas as pd
p = [['ชิโครีตา','พืช',0.9,6.4],
['ฮิโนอาราชิ','ไฟ',0.5,7.9],
['วานิโนโกะ','น้ำ',0.6,9.5]]
pokemon = pd.DataFrame(p)
print(pokemon)
จะได้ผลออกมาเป็นเดตาเฟรมที่แสดงผลในรูปแบบที่เว้นช่องว่างให้ดูเหมือนเป็นตาราง เพียงแต่เมื่อใช้กับอักษรไทย เนื่องจากว่ามีพวกสระลอยจึงทำให้การแสดงผลดูเป็นระเบียบได้ยาก
0 1 2 3
0 ชิโครีตา พืช 0.9 6.4
1 ฮิโนอาราชิ ไฟ 0.5 7.9
2 วานิโนโกะ น้ำ 0.6 9.5
ใน IDE บางตัวการแสดงผลเดตาเฟรมอาจต่างกันออกไปได้ เช่น หากใช้ Jupyter เดตาเฟรมจะถูกแสดงผลในรูปของตารางใน html แบบนี้
|
0 |
1 |
2 |
3 |
0 |
ชิโครีตา |
พืช |
0.9 |
6.4 |
1 |
ฮิโนอาราชิ |
ไฟ |
0.5 |
7.9 |
2 |
วานิโนโกะ |
น้ำ |
0.6 |
9.5 |
สำหรับเนื้อหาต่อจากนี้ไปทั้งหมดจะแสดงเดตาเฟรมในรูปของตารางแบบนี้เพื่อให้ดูง่าย หากใครต้องการให้ได้ผลแบบนี้ก็แนะนำให้ใช้ Jupyter เช่นกัน แม้จะไม่ได้ถึงกับจำเป็น
จะเห็นว่าเดตาเฟรมต่างจากซีรีส์ซึ่งประกอบด้วยชุดข้อมูลอะไรสักอย่างเพียงอย่างเดียว โดยเดตาเฟรมจะประกอบด้วยข้อมูลทั้งหมดกี่อย่างก็ได้ โดยข้อมูลแต่ละอย่างจะเรียงกันอยู่เป็นคนละหลักในแนวนอน ซึ่งเรียกว่าคอลัมน์ (column)
เลข 0 1 2 3 ที่เรียงอยู่ตามแนวนอนนั้นคือชื่อคอลัมน์ ในที่นี้แทน สายพันธุ์, ชนิด, ส่วนสูง และน้ำหนัก ตามลำดับ
ส่วน 0 1 2 ที่เรียงอยู่ตามแถว (แนวตั้ง) นั้นจะเรียกว่าเป็นดัชนี (index)
เช่นเดียวกับในซีรีส์ เราสามารถกำหนดค่าให้กับดัชนีได้ตามที่ต้องการ รวมถึงคอลัมน์เองก็สามารถกำหนดค่าชื่อได้เช่นกัน โดยมีอยู่สองวิธี อย่างแรกคือเพิ่มคีย์เวิร์ด columns กับ index เข้าไป
ตัวอย่างเช่น ลองใส่ชื่อคอลัมน์เพื่อระบุว่าแต่ละคอลัมน์คือข้อมูลของอะไร แล้วก็เปลี่ยนเลขดัชนีให้เป็นหมายเลขของโปเกมอนตัวนั้น แทนที่จะเป็นเลข 0 1 2
p = [['ชิโครีตา','พืช',0.9,6.4],
['ฮิโนอาราชิ','ไฟ',0.5,7.9],
['วานิโนโกะ','น้ำ',0.6,9.5]]
c = ['สายพันธุ์','ชนิด','ส่วนสูง','น้ำหนัก']
index = [152,155,158]
pokemon = pd.DataFrame(p,columns=c,index=index)
print(pokemon)
ได้
|
สายพันธุ์ |
ชนิด |
ส่วนสูง |
น้ำหนัก |
152 |
ชิโครีตา |
พืช |
0.9 |
6.4 |
155 |
ฮิโนอาราชิ |
ไฟ |
0.5 |
7.9 |
158 |
วานิโนโกะ |
น้ำ |
0.6 |
9.5 |
ลิสต์ที่ใช้ใส่ดัชนีและคอลัมน์จะต้องมีขนาดสอดคล้องกับข้อมูล ในที่นี้ตารางนี้มี ๓ แถว ๔ หลัก ดังนั้นลิสต์ดัชนีต้องมี ๓ ตัว ลิสต์คอลัมน์ต้องมี ๔ ตัว
อีกวิธีในการกำหนดดัชนีและคอลัมน์คือป้อนข้อมูลในรูปดิกชันนารีของลิสต์ โดยใช้ชื่อคอลัมน์เป็นคีย์ของดิกชันนารี
p = {'สายพันธุ์':['ชิโครีตา','ฮิโนอาราชิ','วานิโนโกะ'],
'ชนิด':['พืช','ไฟ','น้ำ'],
'ส่วนสูง':[0.9,0.5,0.6],
'น้ำหนัก':[6.4,7.9,9.5]}
pokemon = pd.DataFrame(p,index=[152,155,158])
print(pokemon)
ได้
|
สายพันธุ์ |
ชนิด |
น้ำหนัก |
ส่วนสูง |
152 |
ชิโครีตา |
พืช |
0.9 |
6.4 |
155 |
ฮิโนอาราชิ |
ไฟ |
0.5 |
7.9 |
158 |
วานิโนโกะ |
น้ำ |
0.6 |
9.5 |
จะเห็นว่าวิธีนี้ต่างจากวิธีแรกตรงที่ลิสต์ด้านในจะเป็นลิสต์ของค่าแต่ละชุด (โปเกมอนแต่ละตัว) ในคอลัมน์หนึ่งๆ แทนที่จะเป็นลิสต์ของคอลัมน์ต่างๆของข้อมูลชุดหนึ่ง (โปเกมอนตัวหนึ่ง)
อีกวิธีหนึ่งคือเขียนในรูปดิกชันนารีของดิกชันนารี ดังนั้น
p = {'สายพันธุ์':{152:'ชิโครีตา',155:'ฮิโนอาราชิ',158:'วานิโนโกะ'},
'ชนิด':{152:'พืช',155:'ไฟ',158:'น้ำ'},
'ส่วนสูง':{152:0.9,155:0.5,158:0.6},
'น้ำหนัก':{152:6.4,155:7.9,158:9.5}}
pokemon = pd.DataFrame(p)
จากที่ยกมาจะเห็นได้ว่าเดตาเฟรมสามารถสร้างขึ้นได้หลากหลายวิธี ที่จริงแล้วยังมีอีกมากมายที่ยังไม่ได้พูดถึงและจะค่อยๆพูดถึงต่อไป
การเข้าถึงข้อมูลภายในเดตาเฟรม ข้อมูลภายในเดตรเฟรมสามารถเข้าถึงได้โดยใช้ [] โดยใส่ค่าคอลัมน์ ตามด้วย [] อีกอันที่ใส่ค่าดัชนี
ตัวอย่าง สร้างเดตาเฟรม
p = [['เบย์ลีฟ','พืช',1.2,15.8],
['แม็กมาราชิ','ไฟ',0.9,19.0],
['อาลิเกตซ์','น้ำ',1.1,25.0]]
c = ['สายพันธุ์','ชนิด','ส่วนสูง','น้ำหนัก']
pokemon = pd.DataFrame(p,columns=c,index=[153,156,159])
print(pokemon)
ได้
|
สายพันธุ์ |
ชนิด |
ส่วนสูง |
น้ำหนัก |
153 |
เบย์ลีฟ |
พืช |
1.2 |
15.8 |
156 |
แม็กมาราชิ |
ไฟ |
0.9 |
19.0 |
159 |
อาลิเกตซ์ |
น้ำ |
1.1 |
25.0 |
ลองเข้าถึงข้อมูล
print(pokemon['สายพันธุ์'][153]) # ได้ เบย์ลีฟ
print(pokemon['ชนิด'][156]) # ได้ ไฟ
ตรงนี้ต้องระวังตรงที่ว่าปกติแล้วหากเป็นอาเรย์หรือลิสต์จะต้องระบุดัชนีแนว ตั้งก่อนแล้วตามด้วยแนวนอน แต่สำหรับเดตาเฟรมแล้วจะกลับกัน คือต้องระบุแนวนอน (คอลัมน์) ตามด้วยแนวตั้ง (ดัชนี)
ถ้าใส่แค่คอลัมน์จะได้ผลออกมาเป็นซีรีส์ของหลักนั้น เช่น
print(pokemon['สายพันธุ์'])
ได้
153 เบย์ลีฟ
156 แม็กมาราชิ
159 อาลิเกตซ์
Name: สายพันธุ์, dtype: object
จากตรงนี้จะเห็นภาพชัดว่าเดตาเฟรมประกอบขึ้นจากซีรีส์หลายๆอันมารวมกัน
และจะเห็นว่าซีรีส์ในที่นี้มีข้อมูลเพิ่มมาจากซีรีส์ที่สร้างใน
บทที่แล้ว นั่นคือมี Name: สายพันธุ์ เพิ่มเข้ามา
Name ในที่นี้เป็นแอตทริบิวต์หนึ่งที่สามารถระบุเพิ่มเติมลงในซีรีส์ เพื่อเป็นการบอกว่าซีรีส์นี้เป็นซีรีสืของอะไร เช่นในที่นี้ระบุว่าเป็นซีรีส์ของ "สายพันธุ์" โปเกมอน
ตอนที่สร้างซีรีส์หากต้องการให้มีชื่อสามารถเพิ่มคีย์เวิร์ด name เข้าไปได้ เช่น
pd.Series(['เบย์ลีฟ','แม็กมาราชิ','อาลิเกตซ์'],name='สายพันธุ์',index=[153,156,159])
แบบนี้ก็จะได้ซีรีส์แบบเดียวกับอันข้างต้น
จะเห็นว่าการเข้าถึงข้อมูลแถวต่างๆที่อยู่ในคอลัมน์เดียวกันนั้นทำได้ง่าย แต่ว่าหากต้องการเข้าถึงข้อมูลคอลัมน์ต่างๆในแถวเดียวนั้นจะไม่สามารถทำ อย่างนี้ได้ทันที ต่างจากอาเรย์ที่เราสามารถเขียนในลักษณะประมาณ pokemon[:,153]
หากต้องการเข้าถึงโดยใช้ดัชนีในลักษณะเดียวกับแบบที่ ใช้ในอาเรย์ของ numpy เลยก็อาจทำได้โดยเขียน .loc ก่อนแล้วจึงตามด้วย [] หากทำแบบนี้แล้ววิธีการเข้าถึงข้อมูลจะเป็นเหมือนกับอาเรย์ และลำดับการวางคอลัมน์กับดัชนีจะสลับกับเดิม คือต้องใส่ดัชนีก่อนแล้วจึงตามด้วยคอลัมน์
ตัวอย่าง
print(pokemon.loc[153])
ได้
สายพันธุ์ เบย์ลีฟ
ชนิด พืช
ส่วนสูง 1.2
น้ำหนัก 15.8
Name: 153, dtype: object
จะเห็นว่าทำแบบนี้แล้วก็จะสามารถเข้าถึงข้อมูลแยกในแต่ละแถวได้ (โปเกมอนแต่ละตัว) โดยผลที่ได้จะออกมาในรูปของซีรีส์ และคอลัมน์ต่างๆก็กลายเป็นดัชนีของซีรีส์นั้น จึงเรียงตัวในแนวตั้งแทน
หากใส่ทั้งดัชนีและคอลัมน์จะกลายเป็นต้องใส่ดัชนีก่อนแล้วจึงใส่คอลัมน์ เช่น
print(pokemon['สายพันธุ์'][153])
print(pokemon.loc[153]['สายพันธุ์'])
print(pokemon.loc[153,'สายพันธุ์'])
ทั้งหมดนี้ให้ผลเป็น "เบย์ลีฟ" เหมือนกันหมด
นอกจากนี้หากต้องการเข้าถึงข้อมูลโดยอ้างอิงตามลำดับของแถวและลำดับของคอลัมน์ก็สามารถทำได้โดยใช้ .iloc แทน .loc เช่น
print(pokemon.iloc[2,1]) # ได้ น้ำ
print(pokemon.iloc[1,2]) # ได้ 0.9
print(pokemon.iloc[153]) # ได้ IndexError: single positional indexer is out-of-bounds
ตัวอย่างต่อไปนี้จะให้ผลเหมือนกันหมด
pokemon['ชนิด']
pokemon.loc[:,'ชนิด']
pokemon.iloc[:,1]
คือได้
153 พืช
156 ไฟ
159 น้ำ
Name: ชนิด, dtype: object
# แก้ไขเมื่อ 18/5/2019: เนื่องจากทาง pandas ประกาศว่าจะยกเลิกการใช้ .ix ดังนั้นขอขีดฆ่าเนื้อหาส่วนที่เขียนถึง .ix นี้ไว้ เหลือไว้เป็นประวัติศาสตร์ก็พอ------------------
นอกจากนี้ยังมีอีกตัวคือ .ix ซึ่งจะคล้ายกับ .loc .iloc แต่ต่างกันตรงที่ .ix ว่าจะใส่เป็นค่าหรือลำดับก็ได้
ตัวอย่างเช่นแบบนี้จะใช้ได้เหมือนกัน ค่าที่ได้จะเหมือนกับในตัวอย่างที่แล้ว
pokemon.ix[:,1] # ตามเลขลำดับ
pokemon.ix[:,'ชนิด'] # ตามค่า
เพียงแต่ว่ากรณีที่ค่าเป็นเลขจำนวนเต็มจะไม่สามารถอ้างอิงด้วยเลขลำดับได้ ไม่เช่นนั้นจะตีกัน จะเกิดปัญหาได้ เช่น
pokemon.ix[156] # ไม่มีปัญหา
pokemon.ix[1] # ได้ KeyError: 1
กรณีนี้โปรแกรมจะตามหาดัชนีที่มีค่าเป็น 1 แทนที่จะหาแถวลำดับที่ 1 (แถวที่ 2 จากบน) แต่หาไม่เจอจึงเกิดข้อผิดพลาด ปกติเวลาที่เราเขียนน่าจะรู้อยู่แล้วว่าเราจะอ้างอิงแบบไหน ดังนั้นใช้ .loc หรือ .iloc ไว้จะปลอดภัยกว่า เพื่อไม่ให้เกิดผลผิดพลาดที่ไม่คาดคิด
------------------
สำหรับการเข้าถึงข้อมูลทีละหลายแถวหรือหลายหลักของเดตาเฟรมนั้น ลักษณะการใช้ก็จะคล้ายกันกับในซีรีส์ อย่างไรก็ตาม มีความซับซ้อนกว่ามาก จะขอแยกไปพูดถึงใน
บทที่ ๔ การเพิ่มและแก้ค่าในเดตาเฟรม เมื่อสามารถเข้าถึงค่าภายในเดตาเฟรมได้เราก็สามารถที่จะทำการแก้ไขข้อมูลได้ทันที โดยใช้เครื่องหมายเท่ากับ = เช่นเดียวกับที่ทำในซีรีส์ เพียงแต่ยุ่งยากกว่าตรงที่มีสองมิติ การเพิ่มข้อมูลในแนวตั้งและแนวนอนมีวิธีการที่ต่างกันออกไป
การเพิ่มคอลัมน์ (เพิ่มหลักในแนวนอน) ทำได้โดยชื่อของคอลัมน์ที่ต้องการเพิ่มลงใน [] แล้วตามด้วย = ลิสต์ของค่าที่ต้องการ โดยลิสต์นั้นต้องมีขนาดเท่ากับจำนวนแถวของเดตาเฟรมนั้น
ตัวอย่างเช่น ลองสร้างเดตาเฟรมสำหรับเก็บชื่อและสายพันธ์ของโปเกมอน
pokemon_gold = pd.DataFrame([
['บักทาโร่','ฮิโนอาราชิ'],
['เอทาโร่','เอย์ปาม'],
['เนียวทาโร่','เนียวโรโม'],
],
index=[1,2,3],
columns=['ชื่อ','สายพันธุ์'])
print(pokemon_gold)
ได้
|
ชื่อ |
สายพันธุ์ |
1 |
บักทาโร่ |
ฮิโนอาราชิ |
2 |
เอทาโร่ |
เอย์ปาม |
3 |
เนียวทาโร่ |
เนียวโรโม |
จากนั้นก็ลองเพิ่มข้อมูลเลเวลเข้าไป
pokemon_gold['เลเวล'] = [12,23,21]
print(pokemon_gold)
ได้
|
ชื่อ |
สายพันธุ์ |
เลเวล |
1 |
บักทาโร่ |
ฮิโนอาราชิ |
12 |
2 |
เอทาโร่ |
เอย์ปาม |
23 |
3 |
เนียวทาโร่ |
เนียวโรโม |
21 |
หากต้องการเพิ่มแถว (แนวตั้ง) ก็ทำได้โดยใช้ .loc แล้วตามด้วย [] ที่ใส่ค่าของดัชนีที่ต้องการเพิ่ม แล้วจึงตามด้วย =ลิสต์ของค่าที่ต้องการ โดยลิสต์นั้นต้องมีขนาดเท่ากับจำนวนคอลัมน์ของเดตาเฟรมนั้น
pokemon_gold.loc[4] = ['คิมาทาโร่','ฮิมานัตส์',14]
print(pokemon_gold)
ได้
|
ชื่อ |
สายพันธุ์ |
เลเวล |
1 |
บักทาโร่ |
ฮิโนอาราชิ |
12 |
2 |
เอทาโร่ |
เอย์ปาม |
23 |
3 |
เนียวทาโร่ |
เนียวโรโม |
21 |
4 |
คิมาทาโร่ |
ฮิมานัตส์ |
14 |
ค่าที่ใส่อาจเป็นดิกชันนารีหรือซีรีส์ก็ได้ เช่นอาจเขียนแทนด้วย
pokemon_gold.loc[4] = pd.Series({'ชื่อ':'คิมาทาโร่','สายพันธุ์':'ฮิมานัตส์','เลเวล':14})
# หรือ pokemon_gold.loc[4] = {'ชื่อ':'คิมาทาโร่','สายพันธุ์':'ฮิมานัตส์','เลเวล':14}
ผลที่ได้ก็เหมือนเดิม
หากใส่ชื่อคอลัมน์หรือดัชนีที่มีอยู่แล้วก็จะเป็นการแก้แทนที่ข้อมูลเดิมด้วยลิสต์ที่ใส่ลงไปใหม่แทน
pokemon_gold['เลเวล'] = [40,39,38,35]
pokemon_gold['สายพันธุ์'] = ['บักฟูน','เอย์ปาม','เนียวโรโทโนะ','คิมาวาริ']
print(pokemon_gold)
ได้
|
ชื่อ |
สายพันธุ์ |
เลเวล |
1 |
บักทาโร่ |
บักฟูน |
40 |
2 |
เอทาโร่ |
เอย์ปาม |
39 |
3 |
เนียวทาโร่ |
เนียวโรโทโนะ |
38 |
4 |
คิมาทาโร่ |
คิมาวาริ |
35 |
ค่าชื่อแถวสามารถเปลี่ยนได้โดยเข้าถึงที่ .index ส่วนค่าชื่อคอลัมน์ก็เข้าถึงที่ .column เช่น
pokemon_gold.index = [157,190,186,192]
pokemon_gold.columns = ['ชื่อเล่น','สายพันธุ์','lv']
print(pokemon_gold)
ได้
|
ชื่อเล่น |
สายพันธุ์ |
lv |
157 |
บักทาโร่ |
บักฟูน |
40 |
190 |
เอทาโร่ |
เอย์ปาม |
39 |
186 |
เนียวทาโร่ |
เนียวโรโทโนะ |
38 |
192 |
คิมาทาโร่ |
คิมาวาริ |
35 |
เราอาจสร้างเดตาเฟรมโดยเริ่มจากเดตาเฟรมเปล่าๆแล้วก็ค่อยๆเติมข้อมูลลงไป นี่เป็นอีกวิธีหนึ่งในการสร้างเดตาเฟรม
ตัวอย่างเช่น ลองสร้างเดตาเฟรมเก็บข้อมูลของโปเกมอน ๓ ตัว โดยเริ่มต้นจากเดตาเฟรมเปล่าแล้วค่อยๆเพิ่มข้อมูลไปทีละคอลัมน์
pokemon = pd.DataFrame()
# Empty DataFrame
# Columns: []
# Index: []
pokemon['สายพันธุ์'] = ['เมกาเนียม','บักฟูน','ออร์ไดล์']
pokemon['ชนิด'] = ['พืช','ไฟ','น้ำ']
pokemon['ส่วนสูง'] = [1.8,1.7,2.3]
pokemon['น้ำหนัก'] = [100.5,79.5,88.8]
pokemon.index = [154,157,160]
print(pokemon)
ได้
|
สายพันธุ์ |
ชนิด |
ส่วนสูง |
น้ำหนัก |
154 |
เมกาเนียม |
พืช |
1.8 |
100.5 |
157 |
บักฟูน |
ไฟ |
1.7 |
79.5 |
160 |
ออร์ไดล์ |
น้ำ |
2.3 |
88.8 |
เรา อาจสร้างโดยเพิ่มข้อมูลไปทีละแถวได้เช่นกัน โดยใช้ .loc (ใช้ .iloc ไม่ได้) เพียงแต่ว่ากรณีนี้จำเป็นจะต้องระบุ columns ไว้ตั้งแต่ตอนเริ่มสร้างเดตาเฟรมขึ้น เช่น
pokemon = pd.DataFrame(columns=['สายพันธุ์','ชนิด','ส่วนสูง','น้ำหนัก'])
pokemon.loc[154] = {'สายพันธุ์':'เมกาเนียม','ชนิด':'พืช','ส่วนสูง':1.8,'น้ำหนัก':100.5}
pokemon.loc[157] = pd.Series({'สายพันธุ์':'บักฟูน','ชนิด':'ไฟ','ส่วนสูง':1.7,'น้ำหนัก':79.5})
pokemon.loc[160] = ['ออร์ไดล์','น้ำ',2.3,88.8]
ผลที่ได้จะเหมือนกับตัวอย่างที่แล้ว
การเข้าถึงข้อมูลผ่านแอตทริบิวต์ การเข้าถึงข้อมูลแต่ละคอลัมน์นอกจากจะใส่ชื่อคอลัมน์ลงใน [] หลังชื่อตัวแปรเดตาเฟรมแล้ว กรณีที่ชื่อคอลัมน์นั้นเป็นสายอักขระยังสามารถเข้าในรูปของแอตทริบิวต์ กล่าวคือ เดตาเฟรม.ชื่อคอลัมน์
ตัวอย่างเช่น
pokemon_silver = pd.DataFrame([
['อาลิเกตซ์',29],
['นิวลา',36],
['คิงดรา',33],
['ยามิคาราสึ',29],
['เกียราดอส',30],
],
columns=['สายพันธุ์','lv'],
index=[1,2,3,4,5])
print(pokemon_silver)
ได้
|
สายพันธุ์ |
lv |
1 |
อาลิเกตซ์ |
29 |
2 |
นิวลา |
36 |
3 |
คิงดรา |
33 |
4 |
ยามิคาราสึ |
29 |
5 |
เกียราดอส |
30 |
ดูข้อมูลเลเวล
print(pokemon_silver.lv)
ได้
1 29
2 36
3 33
4 29
5 30
Name: lv, dtype: int64
แต่ชื่อคอลัมน์ที่จะใช้ได้นั้นมีข้อจำกัดอยู่ คือจะต้องไม่ใช่สัญลักษณ์พิเศษ แล้วก็ถ้าเป็นในไพธอน 2 จะไม่สามารถใช้อักษรที่ไม่ใช่ ASCII ได้ ดังนั้นชื่อภาษาไทยก็จะใช้ไม่ได้ด้วย
ดังนั้นถ้าพิมพ์
print(pokemon_silver.สายพันธุ์)
ในไพธอน 3 จะได้
1 อาลิเกตซ์
2 นิวลา
3 คิงดรา
4 ยามิคาราสึ
5 เกียราดอส
Name: สายพันธุ์, dtype: object
แต่ในไพธอน 2 จะได้ SyntaxError: invalid syntax
ชนิดของข้อมูลในเดตาเฟรม ปกติแล้วถ้าเป็นซีรีส์ชนิดของข้อมูลทั้งหมดจะเหมือนกันโดยถูกกำหนดโดยแอตทริบิวต์ dtype
แต่สำหรับเดตาเฟรมแล้วชนิดข้อมูลในแต่ละคอลัมน์อาจไม่เหมือนกันก็ได้ แต่ในแต่ละแถวที่คอลัมน์เดียวกันจะเป็นชนิดเดียวกัน
ชนิดของข้อมูลในเดตาเฟรมจะถูกกำหนดโดยอัตโนมัติโดยขึ้นกับข้อมูลที่ใส่ลงไป เช่นเดียวกับในซีรีส์ และสามารถกำหนดเองโดยคีย์เวิร์ด dtype ได้เช่นกัน เช่น
pokemon = pd.DataFrame([[0.4,6.0],[0.6,23.5],[0.7,21.4],[1.2,75.5]],
index=['มูชูล','เอเลคิด','บูบี','มิลแท็งก์'],
columns=['ส่วนสูง','น้ำหนัก'],dtype='float32')
print(pokemon)
ได้
|
ส่วนสูง |
น้ำหนัก |
มูชูล |
0.4 |
6.0 |
เอเลคิด |
0.6 |
23.5 |
บูบี |
0.7 |
21.4 |
มิลแท็งก์ |
1.2 |
75.5 |
การเปลี่ยนชนิดข้อมูลของทั้งเดตาเฟรมพร้อมกันสามารถทำได้โดยเมธอด astype เช่น
print(pokemon.astype(int))
ได้
|
ส่วนสูง |
น้ำหนัก |
มูชูล |
0 |
6 |
เอเลคิด |
0 |
23 |
บูบี |
0 |
21 |
มิลแท็งก์ |
1 |
75 |
แต่หากต้องการเปลี่ยนชนิดแค่ในบางคอลัมน์ให้ใช้ astype แก้แค่ที่ตัวคอลัมน์นั้น
pokemon['น้ำหนัก'] = pokemon['น้ำหนัก'].astype(int)
print(pokemon)
ได้
|
ส่วนสูง |
น้ำหนัก |
มูชูล |
0.4 |
6 |
เอเลคิด |
0.6 |
23 |
บูบี |
0.7 |
21 |
มิลแท็งก์ |
1.2 |
75 |
สรุปตอนท้าย ในบทนี้ได้เริ่มทำความรู้จักกับพื้นฐานของเดตาเฟรมแล้ว แต่นี่ก็แค่เบื้องต้นเท่านั้น ยังมีอะไรต้องเรียนรู้อีกมากมายเพื่อที่จะสามารถนำมันมาใช้งานได้อย่างเต็มที่
อ้างอิง