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



จัดการข้อมูลด้วย pandas เบื้องต้น บทที่ ๒: เริ่มต้นสร้างและใช้งานเดตาเฟรม
เขียนเมื่อ 2016/09/25 13:38
ในบทแรกได้แนะนำ 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 พืช 6.4 ชิโครีตา 0.9
155 ไฟ 7.9 ฮิโนอาราชิ 0.5
158 น้ำ 9.5 วานิโนโกะ 0.6

จะเห็นว่าวิธีนี้ต่างจากวิธีแรกตรงที่ลิสต์ด้านในจะเป็นลิสต์ของค่าแต่ละชุด (โปเกมอนแต่ละตัว) ในคอลัมน์หนึ่งๆ แทนที่จะเป็นลิสต์ของคอลัมน์ต่างๆของข้อมูลชุดหนึ่ง (โปเกมอนตัวหนึ่ง)

และจะเห็นว่ามีข้อเสียคือดิกชันนารีจะไม่มีลำดับที่แน่นอน ทำให้ลำดับแถวไม่เป็นไปตามที่ใส่

อีกวิธีหนึ่งคือเขียนในรูปดิกชันนารีของดิกชันนารี ดังนั้น
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)

วิธีนี้ไม่อาจกำหนดลำดับของข้อมูลทั้งของคอลัมน์และแถว อย่างไรก็ตามอาจเหมาะสำหรับใช้กับข้อมูลที่แปลงมาจาก json

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



การเข้าถึงข้อมูลภายในเดตาเฟรม
ข้อมูลภายในเดตรเฟรมสามารถเข้าถึงได้โดยใช้ [] โดยใส่ค่าคอลัมน์ ตามด้วย [] อีกอันที่ใส่ค่าดัชนี

ตัวอย่าง สร้างเดตาเฟรม
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

นอกจากนี้ยังมีอีกตัวคือ .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 หรือ .ix แล้วตามด้วย [] ที่ใส่ค่าของดัชนีที่ต้องการเพิ่ม แล้วจึงตามด้วย =ลิสต์ของค่าที่ต้องการ โดยลิสต์นั้นต้องมีขนาดเท่ากับจำนวนคอลัมน์ของเดตาเฟรมนั้น
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 (ใช้ .ix หรือ .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



สรุปตอนท้าย
ในบทนี้ได้เริ่มทำความรู้จักกับพื้นฐานของเดตาเฟรมแล้ว แต่นี่ก็แค่เบื้องต้นเท่านั้น ยังมีอะไรต้องเรียนรู้อีกมากมายเพื่อที่จะสามารถนำมันมาใช้งานได้อย่างเต็มที่



อ้างอิง


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


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

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

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

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> 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月

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

ไทย

日本語

中文