การเข้าถึงตามป้ายกำกับและตามตำแหน่ง
ดึงสมาชิกด้วย .loc (ป้ายกำกับ) และ .iloc (ตำแหน่งจำนวนเต็ม) และทำความเข้าใจความแตกต่างระหว่างทั้งสองแบบ
การเข้าถึงตามป้ายกำกับและตามตำแหน่ง เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
สองวิธีในการเข้าถึงสมาชิกของ Series
Pandas มีตัวเข้าถึงหลักสองแบบสำหรับเลือกองค์ประกอบจาก Series ได้แก่ .loc สำหรับการเข้าถึงตาม ป้ายกำกับ และ .iloc สำหรับการเข้าถึงตาม ตำแหน่งจำนวนเต็ม การทำความเข้าใจว่าควรใช้แบบใดและเมื่อใดเป็นเรื่องสำคัญอย่างยิ่ง เพราะการใช้แบบไม่ถูกต้องกับ Series ที่มีดัชนีเป็นจำนวนเต็มอาจทำให้ได้ผลลัพธ์ที่เข้าใจได้ยาก และ Pandas 2.0 ได้เลิกสนับสนุนการใช้อักขระวงเล็บเหลี่ยมโดยตรงที่มีความกำกวมหลายรูปแบบแล้ว
import pandas as pd
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s.loc['b']) # 20 -- by label
print(s.iloc[1]) # 20 -- by position.loc: การเข้าถึงตามป้ายกำกับ
.loc เข้าถึงองค์ประกอบโดยใช้ ป้ายกำกับดัชนี คุณสามารถส่งป้ายกำกับเดียว (ส่งคืนค่าเดี่ยว) รายการป้ายกำกับ (ส่งคืน Series) หรือช่วงของป้ายกำกับ (รวมปลายทั้งสองด้าน ซึ่งต่างจากช่วงแบบ Python) หากไม่มีป้ายกำกับนั้น Pandas จะแจ้งข้อผิดพลาด KeyError ใช้ .loc เมื่อป้ายกำกับมีความหมาย เช่น วันที่ ชื่อ หรือรหัส
import pandas as pd
s = pd.Series([10, 20, 30, 40, 50],
index=['a', 'b', 'c', 'd', 'e'])
print(s.loc['c']) # 30
print(s.loc[['a', 'c']]) # a:10 c:30
print(s.loc['b':'d']) # b:20 c:30 d:40 -- inclusive.iloc: การเข้าถึงตามตำแหน่ง
.iloc เข้าถึงองค์ประกอบโดยใช้ ตำแหน่งจำนวนเต็ม (เริ่มนับจาก 0) และไม่สนใจป้ายกำกับดัชนีโดยสิ้นเชิง การทำงานเหมือนการจัดทำดัชนีรายการแบบ Python กล่าวคือ ตำแหน่งติดลบจะนับจากท้าย และช่วงจะใช้รูปแบบที่ไม่รวมตำแหน่งสิ้นสุดตามธรรมเนียมของ Python ใช้ .iloc เมื่อต้องการองค์ประกอบลำดับที่ n โดยไม่คำนึงถึงป้ายกำกับ
import pandas as pd
s = pd.Series([10, 20, 30, 40, 50],
index=['a', 'b', 'c', 'd', 'e'])
print(s.iloc[2]) # 30 -- third element
print(s.iloc[-1]) # 50 -- last element
print(s.iloc[1:4]) # b:20 c:30 d:40 -- exclusive stopเมื่อ .loc และ .iloc ให้ผลต่างกัน
ความแตกต่างนี้สำคัญที่สุดสำหรับ Series ที่มีป้ายกำกับเป็นจำนวนเต็ม หาก Series มีป้ายกำกับดัชนีเป็น [5, 10, 15] ดังนั้น s.loc[5] จะส่งคืนองค์ประกอบที่มีป้ายกำกับ 5 (องค์ประกอบแรก) ขณะที่ s.iloc[5] จะแจ้งข้อผิดพลาด IndexError (มีองค์ประกอบอยู่เพียง 3 รายการ) ควรเลือกใช้โดยพิจารณาเสมอว่าคุณหมายถึง “องค์ประกอบที่มีป้ายกำกับ X” หรือ “องค์ประกอบลำดับที่ X”
import pandas as pd
s = pd.Series([100, 200, 300], index=[5, 10, 15])
print(s.loc[10]) # 200 -- element with label 10
print(s.iloc[1]) # 200 -- second element
# s.loc[1] would raise KeyError -- no label 1การเลือกหลายป้ายกำกับด้วย .loc
ส่งรายการให้กับ .loc เพื่อเลือกหลายองค์ประกอบในลำดับใดก็ได้ และอาจมีป้ายกำกับซ้ำกัน ผลลัพธ์คือ Series ใหม่ที่มีป้ายกำกับเหมือนกับรายการที่คุณส่งเข้าไป วิธีนี้คล้ายกับการจัดทำดัชนีแบบพิเศษใน NumPy แต่จัดเรียงตามป้ายกำกับดัชนีแทนตำแหน่ง มักใช้เพื่อจัดลำดับใหม่หรือเลือกบางคอลัมน์ในกระบวนการวิเคราะห์ข้อมูล
import pandas as pd
s = pd.Series({'Jan': 100, 'Feb': 200, 'Mar': 300, 'Apr': 400})
# Select Q1 months in reverse order
print(s.loc[['Mar', 'Feb', 'Jan']])
# Mar 300
# Feb 200
# Jan 100การเลือกช่วงป้ายกำกับด้วย .loc
ต่างจากช่วงแบบ Python ช่วงของ .loc จะ รวมปลายทั้งสองด้าน s.loc['b':'d'] จะส่งคืนองค์ประกอบที่มีป้ายกำกับ b, c และ d ซึ่งอาจทำให้ประหลาดใจหากคุณคุ้นเคยกับรูปแบบที่ไม่รวมตำแหน่งสิ้นสุดของ Python ตรวจสอบให้แน่ใจว่าป้ายกำกับที่ใช้เป็นจุดเริ่มต้นและจุดสิ้นสุดมีอยู่ในดัชนีจริง มิฉะนั้นช่วงอาจส่งคืนผลลัพธ์ที่ไม่คาดคิดโดยไม่แจ้งข้อผิดพลาด
import pandas as pd
s = pd.Series(range(5), index=['a', 'b', 'c', 'd', 'e'])
print(s.loc['b':'d'])
# b 1
# c 2
# d 3
# dtype: int64
# Note: 'd' is INCLUDED (inclusive stop)การจัดทำดัชนีแบบบูลีนด้วย .loc
คุณสามารถส่ง Series แบบบูลีนให้กับ .loc เพื่อกรององค์ประกอบได้ โดย Series แบบบูลีนต้องมีดัชนีเดียวกับ Series เป้าหมาย วิธีนี้เทียบเท่ากับการทำหน้ากากแบบบูลีนของ NumPy และรองรับเงื่อนไขประกอบด้วย & และ | นอกจากนี้ยังเป็นวิธีมาตรฐานสำหรับกรองแถวใน DataFrames
import pandas as pd
s = pd.Series([3, 7, 2, 9, 1], index=['a', 'b', 'c', 'd', 'e'])
print(s.loc[s > 4])
# b 7
# d 9
# dtype: int64การกำหนดค่าด้วย .loc และ .iloc
ทั้ง .loc และ .iloc สามารถอยู่ทางด้านซ้ายของการกำหนดค่าเพื่อ แก้ไข ค่าเดิมได้โดยตรง นี่คือรูปแบบที่ถูกต้อง ส่วนการจัดทำดัชนีต่อเนื่อง เช่น s['a'] = 99 อาจทำให้เกิด SettingWithCopyWarning ใน DataFrames สำหรับ Series การเข้าถึงป้ายกำกับโดยตรงมักปลอดภัย แต่ควรใช้ .loc เพราะระบุเจตนาได้ชัดเจนกว่า
import pandas as pd
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
s.loc['b'] = 99
print(s)
# a 10
# b 99
# c 30การเข้าถึง Series ด้วยวงเล็บเหลี่ยม
รูปแบบวงเล็บเหลี่ยมโดยตรง s['label'] ใช้เข้าถึงตามป้ายกำกับ และเทียบเท่ากับ s.loc['label'] เมื่อดัชนีเป็นข้อความ สำหรับดัชนีจำนวนเต็ม พฤติกรรมมีความกำกวมและถูกเปลี่ยนใน Pandas 2.0 โดยขณะนี้จะหมายถึงการเข้าถึงตามป้ายกำกับเสมอ เพื่อให้โค้ดชัดเจนและรองรับอนาคต ควรใช้ .loc หรือ .iloc อย่างชัดเจน แทนการพึ่งพาการแยกความหมายจากวงเล็บเหลี่ยม
import pandas as pd
s = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
print(s['y']) # 20 -- label access via brackets
print(s.loc['y']) # 20 -- explicit and preferredการเข้าถึงองค์ประกอบจาก DatetimeIndex
เมื่อ Series มี DatetimeIndex แล้ว .loc จะรับข้อความวันที่เพียงบางส่วนเพื่อเลือกช่วงได้อย่างสะดวก s.loc['2023'] จะส่งคืนองค์ประกอบทั้งหมดของปี 2023 และ s.loc['2023-01':'2023-06'] จะส่งคืนองค์ประกอบในช่วงหกเดือนแรกของปี 2023 นี่เป็นหนึ่งในความสามารถของ Pandas ที่ใช้งานกับข้อมูลอนุกรมเวลาได้สะดวกที่สุด
import pandas as pd
dates = pd.date_range('2023-01-01', periods=5, freq='ME')
values = pd.Series([10, 20, 30, 40, 50], index=dates)
print(values.loc['2023-03':'2023-05'])
# 2023-03-31 30
# 2023-04-30 40
# 2023-05-31 50at และ iat สำหรับเข้าถึงองค์ประกอบเดียวอย่างรวดเร็ว
.at[label] และ .iat[position] เป็นตัวเข้าถึงค่าเดี่ยวที่ได้รับการปรับให้มีประสิทธิภาพสูงกว่า .loc และ .iloc เมื่อเข้าถึงองค์ประกอบเดียวซ้ำ ๆ ในลูปที่ทำงานถี่ เพราะข้ามค่าใช้จ่ายในการสร้างออบเจกต์ Series ผลลัพธ์ ทั้งสองแบบไม่สามารถใช้เลือกหลายองค์ประกอบได้ ใช้เมื่อจำเป็นต้องเพิ่มประสิทธิภาพสูงสุดสำหรับการค้นหาองค์ประกอบเดียวซ้ำ ๆ
import pandas as pd
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s.at['b']) # 20 -- label scalar access
print(s.iat[2]) # 30 -- position scalar accessตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับ .loc และ .iloc จากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า .loc เข้าถึงองค์ประกอบตามป้ายกำกับดัชนี โดยช่วงจะรวมตำแหน่งสิ้นสุด .iloc เข้าถึงองค์ประกอบตามตำแหน่งจำนวนเต็ม โดยช่วงไม่รวมตำแหน่งสิ้นสุดเช่นเดียวกับรายการแบบ Python และ .at กับ .iat เป็นตัวเข้าถึงค่าเดี่ยวที่เร็วกว่าเมื่อต้องค้นหาองค์ประกอบเดียวในลูป บทถัดไปเราจะสำรวจการดำเนินการแบบเวกเตอร์บน Series และวิธีที่ Pandas จัดแนวดัชนีให้โดยอัตโนมัติ
คำถามที่พบบ่อย
บทเรียน “การเข้าถึงตามป้ายกำกับและตามตำแหน่ง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเข้าถึงตามป้ายกำกับและตามตำแหน่ง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเข้าถึงตามป้ายกำกับและตามตำแหน่ง”
ดึงสมาชิกด้วย .loc (ป้ายกำกับ) และ .iloc (ตำแหน่งจำนวนเต็ม) และทำความเข้าใจความแตกต่างระหว่างทั้งสองแบบ คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การเข้าถึงตามป้ายกำกับและตามตำแหน่ง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้าง Series
- การเข้าถึงตามป้ายกำกับและตามตำแหน่ง
- การดำเนินการแบบเวกเตอร์บน Series
- เมธอด Series ที่มีประโยชน์