ไพธอนเป็นภาษาที่นิยมใช้ในงานทางด้านการจัดการกับข้อมูล เพราะมีมอดูล (ไลบรารี) เสริมมากมายซึ่งช่วยให้งานง่ายลงมาก
ในจำนวนมอดูลเสริมมากมายนั้น สำหรับงานด้านจัดการข้อมูลแล้วมอดูลที่อาจเรียกได้ว่าขาดไม่ได้เลยก็คือ numpy และ pandas
เรื่องของ numpy ได้เขียนรวบรวมไว้แล้วใน
https://phyblas.hinaboshi.com/saraban/numpy_matplotlib สำหรับบทความนี้จะพูดถึง pandas ซึ่งเป็นมอดูลที่ยืนพื้นอยู่บน numpy โดยเสริมความสามารถต่างๆให้มากขึ้น
ก่อนจะเริ่มอ่านเนื้อหาต่อไปนี้ควรมีพื้นฐาน numpy อยู่แล้ว แนะนำให้อ่านเนื้อหา numpy ในบล็อกนี้ไปจนถึงอย่างน้อยบทที่ ๔ ให้เข้าใจพื้นฐานเกี่ยวกับอาเรย์ แต่ถ้าจะให้ดีควรข้ามไปอ่านบทที่ ๑๕, ๑๗, ๑๙ ด้วย (บทที่เว้นไปเป็นเรื่องของ matplotlib ซึ่งจะไม่ได้เกี่ยวข้องกับบทความนี้โดยตรง)
สำหรับเวอร์ชันของไพธอนที่ใช้นั้น ในนี้ใช้ไพธอน 3 เป็นหลัก แต่ก็ทดสอบในไพธอน 2 ไปด้วย ความแตกต่างระหว่าง 2 กับ 3 ไม่ค่อยมีผลดังนั้นจะใช้เวอร์ชันไหนก็อ่านแล้วทำตามได้ แต่หากตรงไหนที่ต่างกันก็จะเน้นขึ้นมา
การเรียกใช้ pandas pandas ไม่ใช่มอดูลมาตรฐานของไพธอน ดังนั้นเพื่อที่จะใช้ pandas ได้ก่อนอื่นก็จำเป็นจะต้องติดตั้งลงเครื่องก่อน แต่ถ้าใครใช้พวกแพ็กเกจเช่น canopy หรือ spyder ก็จะแถม pandas มาอยู่แล้ว เช่นเดียวกับ numpy, matplotlib, ฯลฯ ดังนั้นจะไม่พูดถึงวิธีการติดตั้งแต่เริ่มพูดถึงการใช้งานเลย
การใช้งานต้องเริ่มจาก import และเนื่องจากมักใช้คู่ไปกับ numpy ดังนั้นจึงแนะนำให้ import numpy ไปด้วย
import numpy as np
import pandas as pd
pd คือตัวย่อที่นิยมใช้ ในนี้ก็จะใช้ตัวย่อนี้ตลอดเช่นกัน
เท่านี้การเตรียมการก็พร้อม
Series และ DataFrame ในมอดูล pandas มีออบเจ็กต์พิเศษ ๒ ชนิดที่นิยามขึ้นมาข้างใน ได้แก่
ซีรีส์ (Series) และ
เดตาเฟรม (DataFrame) มันถูกออกแบบมาเพื่อใช้บรรจุข้อมูลเพื่อนำมาจัดการวิเคราะห์อะไรๆต่อไป
"ซีรีส์" แปลตรงตัวก็คือ "อนุกรม" ซึ่งอนุกรมในที่นี้ก็คือชุดของข้อมูลจำนวนหนึ่งซึ่งนำมาเรียงเข้าด้วยกัน
โดยพื้นฐานแล้วซีรีส์มีความคล้ายคลึงกับลิสต์และดิกชันนารีซึ่งเป็นชนิดข้อมูล พื้นฐานของไพธอน แต่ว่าซีรีส์ยืนพื้นอยู่บนอาเรย์ของ numpy ทำให้เพิ่มความสามารถมากขึ้นมา
ส่วนเดตาเฟรมคือตารางของข้อมูล ซึ่งประกอบขึ้นจากซีรีส์หลายๆอัน
ตารางข้อมูลที่อยู่ในรูปเดตาเฟรม นี้จะเป็นเครื่องมือหลักที่ใช้ในงานแทบทั้งหมดของ pandas
เดตาเฟรมนั้นที่จริงแล้วมีโครงสร้างที่ค่อนข้างซับซ้อน ในเบื้องต้นจะรู้สึกว่ามันเข้าใจยากอยู่พอสมควร แต่หากเข้าใจและสามารถใช้งานได้คล่องแล้วเราจะสามารถจัดการกับข้อมูลภายใน ได้อย่างอิสระ
หลักการทำงานกับ pandas โดยคร่าวๆแล้วก็คือเริ่มจากทำยังไงก็ได้เพื่อให้ข้อมูลของเราไปอยู่ในตาราง เดตาเฟรมจากนั้นก็ใช้ควาสามารถต่างๆของ pandas เพื่อจัดการกับข้อมูลภายในนี้เพื่อให้ได้ผลลัพธ์ตามที่ต้องการ
การสร้างซีรีส์ เดตาเฟรมมีพื้นฐานมาจากซีรีส์ดังนั้นเริ่มแรกควรเริ่มจากทำความเข้าใจซีรีส์ก่อน
ซีรีส์สามารถถูกสร้างขึ้นได้จากหลายๆวิธี วิธีที่ง่ายๆที่สุดเลยก็คือสร้างขึ้นจากลิสต์โดยใช้ pd.Series (ระวังว่า S ในที่นี้ต้องใช้เป็นตัวใหญ่)
ตัวอย่าง สร้างซีรีส์สำหรับเก็บชื่อโปเกมอน ๕ ตัว
pokemon = pd.Series(['ฟุชิงิดาเนะ','ฮิโตคาเงะ','เซนิงาเมะ','คาเตอร์ปี','บีเดิล'])
print(pokemon)
ได้
0 ฟุชิงิดาเนะ
1 ฮิโตคาเงะ
2 เซนิงาเมะ
3 คาเตอร์ปี
4 บีเดิล
dtype: object
เท่านี้ก็ได้ซีรีส์สำหรับเก็บชื่อโปเกมอน และจะเห็นว่าพอสั่ง
print ซีรีส์ออกมาจะอยู่ในรูปที่ดูเป็นระเบียบดูง่าย
ที่ตอนท้ายสุดจะเห็นว่าระบุ dtype เอาไว้ dtype นี้คือชนิดของข้อมูล เช่นเดียวกับในอาเรย์ของ numpy นั่นเอง
ชนิดข้อมูลจะถูกกำหนดตามชนิดข้อมูล ถ้าหากข้อมูลที่ใส่ไม่ใช่ตัวเลขก็จะออกมาเป็นชนิด object ซึ่งอาจจะเป็นออบเจ็กต์ชนิดใดก็ได้
หากลองใส่ข้อมูลที่เป็นจำนวนเต็มก็จะได้ชนิดข้อมูลเป็น int64 เช่น
print(pd.Series([1,2,9,3]))
ได้
0 1
1 2
2 9
3 3
dtype: int64
ถ้าใส่ข้อมูลเป็นจำนวนที่มีทศนิยมจะได้ชนิดข้อมูลเป็น float64
print(pd.Series([1,2,9,3.1]))
ได้
0 1.0
1 2.0
2 9.0
3 3.1
dtype: float64
แต่ถ้ามีข้อมูลที่ไม่ใช่ตัวเลขปนอยู่แม้แต่ตัวเดียวก็จะได้เป็นข้อมูลชนิด object ชนิดของข้อมูลอาจปนกันได้ แต่ถ้าหากต้องการให้ข้อมูลสามารถใช้ประโยชน์จากความสามารถในการคำนวณอะไร ต่างๆได้ก็ควรจะใส่แต่ตัวเลขล้วนๆเพื่อให้เป็น int หรือ float
ชนิดข้อมูลสามารถระบุได้ตอนสร้างโดยเพิ่มคีย์เวิร์ด dtype ข้อมูลที่ใส่จะถูกเปลี่ยนเป็นชนิดนั้นให้โดยอัตโนมัติไม่ว่าจะใส่อะไรลงไป (แต่ถ้าเปลี่ยนไม่ได้ก็จะเกิดข้อผิดพลาด)
print(pd.Series([1,2,'9',3.1],dtype='int64')) # หรือ dtype=int
ได้
0 1
1 2
2 9
3 3
dtype: int64
ข้อมูลภายในสามารถเข้าถึงได้โดยอาศัยดัชนีซึ่งอยู่ทางซ้าย เช่น
pokemon = pd.Series(['ฟุชิงิโซว','ลิซาร์โด','คาเมล','ทรานเซล','โคคูน'])
# 0 ฟุชิงิโซว
# 1 ลิซาร์โด
# 2 คาเมล
# 3 ทรานเซล
# 4 โคคูน
print(pokemon[0]) # ได้ ฟุชิงิโซว
print(pokemon[2]) # ได้ คาเมล
ดัชนีทางซ้ายนี้ถูกกำหนดขึ้นโดยอัตโนมัติตอนที่ซีรีส์ถูกสร้างขึ้นมาให้เรียงตาม ลำดับโดยไล่จาก 0 แต่จริงๆแล้วเราสามารถกำหนดดัชนีได้เอง
การกำหนดดัชนีเองอาจทำได้โดยที่ตอนที่สร้างแทนที่จะสร้างขึ้นจากลิสต์ก็ให้สร้างขึ้นจากดิกชันนารีแทน
ตัวอย่างเช่น ใช้ดัชนีเป็นหมายเลขของโปเกมอน
pokemon = pd.Series({2:'ฟุชิงิโซว',5:'ลิซาร์โด',8:'คาเมล',11:'ทรานเซล',14:'โคคูน'})
print(pokemon)
ได้
2 ฟุชิงิโซว
5 ลิซาร์โด
8 คาเมล
11 ทรานเซล
14 โคคูน
dtype: object
แบบนี้แล้วเวลาอ้างอิงถึงข้อมูลภายในก็จะใช้ดัชนีตามที่กำหนดนี้ เช่น
print(pokemon[2]) # ได้ ฟุชิงิโซว
อีกวิธีหนึ่งคือใส่คีย์เวิร์ด index เพิ่มเข้าไป เช่น
pokemon = pd.Series(['ฟุชิงิโซว','ลิซาร์โด','คาเมล','ทรานเซล','โคคูน'],
index=[2,5,8,11,14])
ก็จะได้ผลเหมือนตัวอย่างที่แล้ว
แต่วิธีนี้จะดีกว่าเพราะดิกชันนารีจะไม่มีการเรียงลำดับข้อมูล ดังนั้นอาจทำให้เกิดการเรียงลำดับที่ต่างไปจากที่เราใส่ได้
ดัชนีอาจไม่ใช่ตัวเลขแต่จะใช้เป็นอะไรก็ได้ เช่นใช้สายอักขระ
pokemon = pd.Series(['ฟุชิงิโซว','ลิซาร์โด','คาเมล','ทรานเซล','โคคูน'],
index=['๐๐๒','๐๐๕','๐๐๘','๐๑๑','๐๑๔'])
print(pokemon)
ได้
๐๐๒ ฟุชิงิโซว
๐๐๕ ลิซาร์โด
๐๐๘ คาเมล
๐๑๑ ทรานเซล
๐๑๔ โคคูน
dtype: object
เราสามารถดึงเอาแต่ค่าดัชนีออกมาได้โดยดูค่าแอตทริบิวต์ index ของตัวซีรีส์นั้นๆ เช่น
print(pokemon.index)
ได้
Index(['๐๐๒', '๐๐๕', '๐๐๘', '๐๑๑', '๐๑๔'], dtype='object')
***ในไพธอน 2 จะได้เป็น Index([u'๐๐๑', u'๐๐๕', u'๐๐๘', u'๐๑๑', u'๐๑๔'], dtype='object')
และเอาเฉพาะค่าข้อมูลออกมาในรูปของอาเรย์ได้โดยใช้แอตทริบิวต์ values เช่น
print(pokemon.values)
ได้
['ฟุชิงิโซว' 'ลิซาร์โด' 'คาเมล' 'ทรานเซล' 'โคคูน']
***ในไพธอน 2 จะออกมาในรูปของโค้ดรหัสตัวอักษร
หรือจะใช้เมธอด as_matrix() ก็ได้ เมธอดนี้มีไว้นำค่าใน series มาเขียนอยู่ในรูปอาเรย์ของ numpy
เขียนแบบนี้ก็จะได้ผลเหมือนตัวอย่างข้างต้น
print(pokemon.as_matrix())
การเข้าถึงข้อมูลเป็นกลุ่ม ลิสต์หรืออาเรย์ในไพธอนมีวิธีการอ้างอิงเข้าถึงข้อมูลภายในทีละหลายตัวได้โดย ใช้โคลอน : เช่น a[1:4] เป็นการเข้าถึงข้อมูลที่มีดัชนีเป็น 1 ถึง 3 (คือตัวที่ 2 ถึง 4) เป็นต้น (ใครที่ยังไม่แม่นเรื่องนี้ให้ทวนโดยอ่าน
numpy เบื้องต้นบทที่ ๒ และ
ภาษา python เบื้องต้น บทที่ ๘)
สำหรับซีรีส์นั้นต่อให้ดัชนีจะไม่ใช่ตัวเลข แต่ว่าข้อมูลมีลำดับที่แน่นอน ดังนั้นจึงสามารถเข้าถึงได้ด้วยวิธีนี้เช่นกัน
ตัวอย่าง สร้างตารางเก็บค่าน้ำหนักโปเกมอนแต่ละตัวโดยใช้ชื่อโปเกมอนเป็นดัชนี
pokemon_nak = pd.Series(
[155.5,110.5,101.1,32.0,29.5],
index=['ฟุชิงิบานะ','ลิซาร์ดอน','คาเม็กซ์','บัตเตอร์ฟรี','เสปียร์']
)
# ฟุชิงิบานะ 155.5
# ลิซาร์ดอน 110.5
# คาเม็กซ์ 101.1
# บัตเตอร์ฟรี 32.0
# เสปียร์ 29.5
print(pokemon_nak[2:4])
ได้
คาเม็กซ์ 101.1
บัตเตอร์ฟรี 32.0
dtype: float64
จะเห็นว่าผลที่ได้ก็จะยังเป็นซีรีส์เหมือนเดิม ต่างจากการใส่ค่าดัชนีเป็นตัวเดียว ซึ่งจะได้ออกมาเป็นค่าในนั้นเลย
หากต้องการเข้าถึงข้อมูลภายในตัวเดียวจะใช้ค่าตัวเลขลำดับหรือใช้ค่าดัชนีนั้นโดยตรงก็ได้ เช่น
print(pokemon_nak[2]) # ได้ 101.1
print(pokemon_nak['ลิซาร์ดอน']) # ได้ 110.5
สรุปคือเวลาที่ใส่ค่าดัชนีตัวเดียวเพื่อเข้าถึงสมาชิกภายในนั้นจะเริ่มค้นหาตัว ที่มีค่าดัชนีตามที่ใส่ไป แต่หากหาไม่เจอจึงค่อยเปลี่ยนมาหาโดยถือว่าตัวนั้นเป็นค่าลำดับ แต่ถ้าค่านั้นไม่ใช่จำนวนเต็มกรณีนี้ก็จะเกิดขัดข้องขึ้นมา
และมีข้อควรระวังอยู่คือในกรณีที่ใช้ดัชนีเป็นตัวเลขอยู่แล้ว เพราะในกรณีนี้การอ้างถึงโดยใช้เลขตัวเดียวกับโดยใช้เลขที่มี : จะให้ความหมายต่างกันไปคนละทาง
กล่าวคือหากใช้ตัวเลขตัวเดียว ตัวเลขนั้นจะแทนค่าในดัชนี แต่หากใช้ : ตัวเลขนั้นจะเป็นเลขลำดับ
ตัวอย่าง
pokemon = pd.Series(
['ฟุชิงิดาเนะ','ฮิโตคาเงะ','เซนิงาเมะ','คาเตอร์ปี',
'บีเดิล','โป๊ปโป','โครัตตา','โอนิสึซึเมะ'],
index=[1,4,7,10,13,16,19,21]
)
print(pokemon[1]) # ได้ ฟุชิงิดาเนะ ไม่ใช่ ฮิโตคาเงะ ตามเลขลำดับ
print(pokemon[1:2]) # ได้ 4 ฮิโตคาเงะ ตามเลขลำดับ
print(pokemon[7]) # ได้ เซนิงาเมะ ไม่ใช่ โอนิสึซึเมะ ตามเลขลำดับ
print(pokemon[7:10]) # ได้ 21 โอนิสึซึเมะ ตามเลขลำดับ
print(pokemon[10]) # ได้ KeyError: 10 เพราะหาดัชนีเลขนั้นไม่เจอ
นอกจากนี้จะใช้คีย์เป็นลิสต์หรืออาเรย์ก็ได้ ในกรณีนี้ถึงใช้ดัชนีเป็นตัวเลขก็จะเป็นการหาดัชนีที่มีตัวเลขนั้น ไม่ใช่ตามลำดับ และหากตัวไหนไม่เจอก็จะได้ค่าเป็น NaN (หมายถึงไม่มีค่า)
ตัวอย่าง
print(pokemon[[11,13,15,17,19,21]])
# หรือ print(pokemon[np.arange(11,22,2)])
ได้
11 NaN
13 บีเดิล
15 NaN
17 NaN
19 โครัตตา
21 โอนิสึซึเมะ
dtype: object
จะเห็นว่าคุณสมบัติการใช้ดัชนีเป็นลิสต์นี้ทำได้เหมือนกับที่ใช้ในอาเรย์ (รายละเอียดอ่าน
numpy เบื้องต้นบทที่ ๑๙)
ในลักษณะเดียวกันนี้จึงสามารถใช้อาเรย์หรือลิสต์ชนิดบูลมาเป็นดัชนีได้เช่นกัน
k = np.array([False,True,True,False,False,False,False,True])
print(pokemon[k])
ได้
4 ฮิโตคาเงะ
7 เซนิงาเมะ
21 โอนิสึซึเมะ
dtype: object
จะเห็นว่าจะเป็นการคัดกรองเหลือแค่สมาชิกในลำดับที่เป็น True
และเมื่อมาประยุกต์ใช้แล้วจึงสามารถใช้วิธีการกรองส่วนประกอบได้ในลักษณะเดียวกับอาเรย์ เช่น
print(pokemon=='เซนิงาเมะ')
print('--------------')
print(pokemon[pokemon=='เซนิงาเมะ'])
ได้
1 False
4 False
7 True
10 False
13 False
16 False
19 False
21 False
dtype: bool
--------------
7 เซนิงาเมะ
dtype: object
จะคัดกรองโดยดูจากเลขดัชนีก็ได้ โดยดูเงื่อนไขที่ค่าแอตทริบิวต์ index เช่น
print(pokemon.index) # แสดงค่าดัชนีทั้งหมด
print(pokemon.index%2==0) # คัดเฉพาะดัชนีที่เป็นเลขคู่
print(pokemon[pokemon.index%2==0]) # ผลการคัดกรอง
ได้
Int64Index([1, 4, 7, 10, 13, 16, 19, 21], dtype='int64')
[False True False True False True False False]
4 ฮิโตคาเงะ
10 คาเตอร์ปี
16 โป๊ปโป
dtype: object
การวิเคราะห์ข้อมูลภายในซีรีส์ ซีรีส์สามารถใช้เมธอดต่างๆได้ในลักษณะเดียวกับที่ใช้ได้ในอาเรย์ เช่น max, argmax, sum, mean, ฯลฯ
ตัวอย่าง ลองสร้างซีรีส์เก็บข้อมูลน้ำหนักของโปเกมอนแต่ละตัว แล้วนำมาหาค่าสูงสุดต่ำสุด, ค่าเฉลี่ย, ผลรวม, ฯลฯ
pokemon_nak = pd.Series(
[6.0,9.9,5.4,0.8,12.4,19.5],
index=['พีคาชู','โรคอน','พาราส','ดิกดา','เนียวโรโม','วันริกี']
)
print(pokemon_nak.sum()) # ได้ 54.0
print(pokemon_nak.mean()) # ได้ 9.0
print(pokemon_nak.max()) # ได้ 19.5
print(pokemon_nak.argmax()) # ได้ วันริกี
print(pokemon_nak.min()) # ได้ 0.8
print(pokemon_nak.argmin()) # ได้ ดิกดา
print(pokemon_nak.std()) # ได้ 6.508763323397156
การเพิ่มและแก้ไขข้อมูลภายในซีรีส์ การเพิ่มและแก้ไขข้อมูลภายในซีรีส์นั้นสามารถทำได้ในลักษณะเช่นเดียวกับดิกชัน นารี นั่นคือสามารถแก้ไขได้ง่ายโดยการเข้าถึงข้อมูลภายในซีรีส์ด้วยวิธีต่างๆแล้ว ใช้เครื่องหมายเท่ากับ = แทนค่าลงไปได้เลย และกรณีที่ดัชนีที่ใส่ลงไปนั้นไม่มีอยู่ก็จะกลายเป็นการเพิ่มข้อมูลเข้าไป
ตัวอย่าง สร้างตารางข้อมูลเลเวลของโปเกมอน โดยตอนแรกมีแค่ ๔ ตัว จากนั้นก็ค่อยเพิ่มข้อมูลเข้าไปอีก ๒ ตัว
pokemon_lv = pd.Series(
[58,25,22,11],
index=['พีคาชู','โครัตตา','โดโด','คาเตอร์ปี']
)
# พีคาชู 58
# โครัตตา 25
# โดโด 22
# คาเตอร์ปี 11
pokemon_lv['ออมไนต์'] = 38
pokemon_lv['โกโลน'] = 35
print(pokemon_lv)
ได้
พีคาชู 58
โครัตตา 25
โดโด 22
คาเตอร์ปี 11
ออมไนต์ 38
โกโลน 35
dtype: int64
เนื่องจากออนไนต์และโกโลนไม่มีอยู่ในดัชนีเดิม ดังนั้นจึงเป็นการเพิ่มข้อมูลเข้าไป แต่ถ้ามีอยู่แล้วก็จะเป็นการแก้ไข เช่น
pokemon_lv['โครัตตา'] = 23
print(pokemon_lv)
ได้
พีคาชู 58
โครัตตา 23
โดโด 22
คาเตอร์ปี 11
ออมไนต์ 38
โกโลน 35
dtype: int64
การแก้ข้อมูลเป็นกลุ่มพร้อมกันทีเดียวก็สามารถทำได้เช่นกัน
pokemon_lv[3:6] = [14,39,36]
pokemon_lv[[0,2]] = [59,26]
print(pokemon_lv)
ได้
พีคาชู 59
โครัตตา 23
โดโด 26
คาเตอร์ปี 14
ออมไนต์ 39
โกโลน 36
dtype: int64
ค่าดัชนีเองก็สามารถเปลี่ยนได้โดยป้อนค่า index ใหม่เข้าไป โดยจะป้อนด้วยลิสต์หรืออาเรย์ก็ได้
pokemon_lv.index = ['พีคา','รัจจัง','โดโดสึเกะ','พีสึเกะ','ออมสึเกะ','โกโลสึเกะ']
print(pokemon_lv)
ได้
พีคา 59
รัจจัง 23
โดโดสึเกะ 26
พีสึเกะ 14
ออมสึเกะ 39
โกโลสึเกะ 36
dtype: int64
การเปลี่ยนลำดับและลบข้อมูลในซีรีส์ ข้อมูลในซีรีส์นั้นมีลำดับที่แน่นอน หากต้องการเปลี่ยนลำดับก็สามารถทำได้โดยสร้างลิสต์ซึ่งใส่ดัชนีที่สลับลำดับ เป็นไปตามที่ต้องการ จากนั้นก็ใช้ลิสต์นี้มาเป็นดัชนีเข้าถึงซีรีส์อีกที
ตัวอย่าง
pokemon_nak = pd.Series(
[305.0,220.0,29.0,35.0,55.4,210.0],
index=['เกียราดอส','ลาปลาส','เชาเวอร์ส','ออมสตาร์','ฟรีเซอร์','ไคริว']
)
# เกียราดอส 305.0
# ลาปลาส 220.0
# เชาเวอร์ส 29.0
# ออมสตาร์ 35.0
# ฟรีเซอร์ 55.4
# ไคริว 210.0
p = ['ไคริว','เชาเวอร์ส','เกียราดอส','ออมสตาร์','ลาปลาส','ฟรีเซอร์']
pokemon_nak = pokemon_nak[p]
ได้
ไคริว 210.0
เชาเวอร์ส 29.0
เกียราดอส 305.0
ออมสตาร์ 35.0
ลาปลาส 220.0
ฟรีเซอร์ 55.4
dtype: float64
นอกจากนี้ยังมีอีกวิธีคือใช้เมธอด reindex ซึ่งจะให้ผลเหมือนกัน ถ้าใช้วิธีนี้จะเขียนแบบนี้
pokemon_nak = pokemon_nak.reindex(['ไคริว','เชาเวอร์ส','เกียราดอส','ออมสตาร์','ลาปลาส','ฟรีเซอร์'])
การใช้ reindex จะยืดหยุ่นกว่าแต่ก็มีรายละเอียดเพิ่มเติมซึ่งจะยังไม่กล่าวถึงในบทนี้
และถ้าใส่ดัชนีแค่บางส่วนลบบางตัวออกก็จะกลายเป็นการลบข้อมูลออก
pokemon_nak = pokemon_nak[['เชาเวอร์ส','เกียราดอส','ฟรีเซอร์','ออมสตาร์','ลาปลาส']]
# หรือ pokemon_nak = pokemon_nak.reindex(['เชาเวอร์ส','เกียราดอส','ฟรีเซอร์','ออมสตาร์','ลาปลาส'])
print(pokemon_nak)
ได้
เชาเวอร์ส 29.0
เกียราดอส 305.0
ฟรีเซอร์ 55.4
ออมสตาร์ 35.0
ลาปลาส 220.0
dtype: float64
หรืออาจใช้คำสั่ง del เพื่อลบก็ได้เช่นกัน
del pokemon_nak['ฟรีเซอร์']
print(pokemon_nak)
ได้
เชาเวอร์ส 29.0
เกียราดอส 305.0
ออมสตาร์ 35.0
ลาปลาส 220.0
dtype: float64
และหากต้องการเรียงลำดับตามค่าในซีรีส์ก็ทำได้โดยเมธอด sort_values()
pokemon_nak = pokemon_nak.sort_values()
print(pokemon_nak)
ได้
เชาเวอร์ส 29.0
ออมสตาร์ 35.0
ลาปลาส 220.0
เกียราดอส 305.0
dtype: float64
หากต้องการเรียงจากมากมาน้อยใส่ใส่คีย์เวิร์ด ascending เป็น 0 หรือ False (ถ้าไม่ใส่จะเป็น 1 หรือ True หมายถึงเรียงจากน้อยมามาก)
pokemon_nak = pokemon_nak.sort_values(ascending=0)
print(pokemon_nak)
ได้
เกียราดอส 305.0
ลาปลาส 220.0
ออมสตาร์ 35.0
เชาเวอร์ส 29.0
dtype: float64
เรื่องของเมธอด reindex และ sort_values นั้นยังมีรายละเอียดมากกว่านี้ ซึ่งจะกล่าวถึงใน
บทที่ ๗ สรุปตอนท้าย จะเห็นว่าซีรีส์ก็เปรียบเสมือนเป็นอาเรย์หนึ่งมิติที่เพิ่มดัชนีขึ้นไป จากที่เดิมทีอาเรย์จะใช้เลขดัชนีเป็นตามลำดับจำนวนเต็มไล่จาก 0 พอใช้ซีรีส์แล้วเราสามารกำหนดดัชนีให้เป็นไปตามต้องการได้เหมือนอย่างดิกชัน นารี เพียงแต่ว่าต่างกับดิกชันนารีตรงที่ดัชนีในซีรีส์มีลำดับแน่นอน และใช้ความสามารถของอาเรย์ได้
แต่ว่าซีรีส์นั้นเป็นแค่แถวของข้อมูลซึ่งมีเพียงมิติเดียวเท่านั้น หากเรามีข้อมูลหลายชุดก็จำเป็นจะต้องสร้างซีรีส์ขึ้นหลายๆอัน
และหลายซีรีส์ก็จะมารวมเข้าเป็นตาราง และตารางข้อมูลที่เกิดจากการรวมนั้นก็คือเดตาเฟรม หากเทียบซีรีส์กับอาเรย์หนึ่งมิติ เดตาเฟรมก็เทียบได้กับอาเรย์สองมิตินั่นเอง
เรื่องของเดตาเฟรมจะแนะนำใน
บทถัดไป อ้างอิง