φυβλαςのβλογ
บล็อกของ 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
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
เรียนภาษาจีน
qiita
บทความอื่นๆ

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



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

  ค้นหาบทความ

  บทความแนะนำ

หลักการเขียนทับศัพท์ภาษาจีนกวางตุ้ง
การใช้ unix shell เบื้องต้น ใน linux และ mac
หลักการเขียนทับศัพท์ภาษาจีนกลาง
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
บันทึกการเที่ยวสวีเดน 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月

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

ไทย

日本語

中文