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



จัดการข้อมูลด้วย pandas เบื้องต้น บทที่ ๑: ซีรีส์
เขียนเมื่อ 2016/09/25 13:36
ไพธอนเป็นภาษาที่นิยมใช้ในงานทางด้านการจัดการกับข้อมูล เพราะมีมอดูล (ไลบรารี) เสริมมากมายซึ่งช่วยให้งานง่ายลงมาก

ในจำนวนมอดูลเสริมมากมายนั้น สำหรับงานด้านจัดการข้อมูลแล้วมอดูลที่อาจเรียกได้ว่าขาดไม่ได้เลยก็คือ numpy และ pandas

เรื่องของ numpy ได้เขียนรวบรวมไว้แล้วใน https://phyblas.hinaboshi.com/31a

สำหรับบทความนี้จะพูดถึง 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 พอใช้ซีรีส์แล้วเราสามารกำหนดดัชนีให้เป็นไปตามต้องการได้เหมือนอย่างดิกชัน นารี เพียงแต่ว่าต่างกับดิกชันนารีตรงที่ดัชนีในซีรีส์มีลำดับแน่นอน และใช้ความสามารถของอาเรย์ได้

แต่ว่าซีรีส์นั้นเป็นแค่แถวของข้อมูลซึ่งมีเพียงมิติเดียวเท่านั้น หากเรามีข้อมูลหลายชุดก็จำเป็นจะต้องสร้างซีรีส์ขึ้นหลายๆอัน

และหลายซีรีส์ก็จะมารวมเข้าเป็นตาราง และตารางข้อมูลที่เกิดจากการรวมนั้นก็คือเดตาเฟรม หากเทียบซีรีส์กับอาเรย์หนึ่งมิติ เดตาเฟรมก็เทียบได้กับอาเรย์สองมิตินั่นเอง

เรื่องของเดตาเฟรมจะแนะนำในบทถัดไป



อ้างอิง


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


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

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

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

หมวดหมู่

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

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

สารบัญ

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

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

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



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

  ค้นหาบทความ

  บทความแนะนำ

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

ไทย

日本語

中文